2010-05-06 66 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