2010-05-06 64 views
1

MySQL的選擇不同的值我有兩個表:跨多個表

table_1 
uid | xid | name 

table_2 
uid | elements | time | pkey 

我想選擇的XID,元件和時間的多行,其中時間是10個最小值和uid(或XID)是不同的。

UID,XID在TABLE_1是獨一無二的,在TABLE_1和TABLE_2 UID之間的關係是一對多..

我想是這樣的,但它不是真正的工作太清楚:

SELECT table_1.xid, MIN(table_2.time), table_2.elements 
FROM table_1, table_2 
WHERE table_1.uid= table_2.uid 
GROUP BY table_2.uid 
LIMIT 10 

讓我們一些數據來玩弄:

table_1 
uid | xid | name 
1 | 435 | John 
2 | 596 | Jane 


table_2 
uid | elements | time | pkey 
1 | 1 | 567 | 0 
2 | 2 | 335 | 1 
1 | 1 | 435 | 2 
1 | 2 | 456 | 3 
2 | 1 | 337 | 4 
1 | 1 | 428 | 5 

我怎麼會選擇每個UID頂部2個不同的結果? 在這種情況下:

fid| elements | time 
596| 2 | 335 
435| 1 | 428 

謝謝!

如果人們不明白,爲什麼lexu的解決方案不工作 - 它不綁定到主鍵上表2

如果我上面的數據更改爲:

table_2 
uid | elements | time | pkey 
1 | 1 | 567 | 0 
2 | 2 | 335 | 1 
1 | 1 | 435 | 2 
1 | 2 | 456 | 3 
2 | 1 | 337 | 4 
1 | 2 | 428 | 5 

保持TABLE_1相同那麼結果應該是:

fid| elements | time 
596| 2 | 335 
435| 2 | 428 

但@ lexu的解決方案的結果是:

fid| elements | time 
596| 2 | 335 
435| 1 | 428 

儘管如此,感謝大家的幫助,尤其是@eagle!

+0

難道你不忘記什麼?這些表格之間的連接是什麼? xid - > uid? JOIN + GROUP BY不適合你嗎? – 2010-05-06 07:42:20

+0

uid - > uid ..我將在上面解釋更多.. – PoorCoder 2010-05-06 07:53:24

+0

通過XID做你的小組..然後它應該工作 – lexu 2010-05-06 08:07:19

回答

1

這是我的解決方案。我想,而不是僅僅給工作查詢,我會走一步看一步的通過我的思維過程和我的每一步嘗試查詢:

首先,讓我們選擇10周最小的時間不同uid

select uid, min(time) 
from table_2 
group by uid 
order by 2 
limit 10 

這給我們:

uid | time 
2 | 335 
1 | 428 

這很容易...不幸的是,這並沒有讓我們抓住主鍵,這將是如果添加以下行的一個問題:

table_2 
uid | elements | time | pkey 
1 | 2 | 428 | 6 

在以後的查詢,當我們嘗試加入的timeuid,我們會得到兩個記錄,而不是1,所以我們需要一個更好的查詢返回一個不同的值(例如pkey)而不是time,我假設它可以是不明顯的...

注意:如果MySQL具有FIRST()LAST()集合函數,這將會簡單得多。不幸的是,它不是我們必須解決的一個子查詢,訂單,限制組合。

select 
    t2.uid, 
    (select pkey from table_2 t3 where t2.uid = t3.uid order by t3.time asc limit 1) as minpkey 
from 
    (select uid, min(time) from table_2 group by uid order by 2 limit 10) t2 

現在,這將返回結果,我們可以一起工作:

uid | minpkey 
1 | 5 
2 | 1 

注意,5隨機選擇,並且在6可能有很容易地被選擇;這一切都取決於mysql如何決定選擇它。但對我們來說,這並不重要。

接下來我們要顯示更多的數據(即xidelements字段):

select t1.xid as fid, t5.elements, t5.time 
from 
(select 
    t2.uid, 
    (select pkey from table_2 t3 where t2.uid = t3.uid order by t3.time asc limit 1) as minpkey 
from 
    (select uid, min(time) from table_2 group by uid order by 2 limit 10) t2 
) t4 
inner join table_1 t1 on (t4.uid = t1.uid) 
inner join table_2 t5 on (t4.minpkey = t5.pkey) 

和中提琴,就應該回報你在你的例子提供完全相同的數據!它可能不是很有效,但它應該工作!

+0

謝謝 - 多數民衆贊成 - 現在我想我需要看看我是否可以讓我的表更有效率或者我的查詢效率更高! – PoorCoder 2010-05-06 10:25:00