我想选择每个成员最高的最后一行。
ID UID POINT DATE TIME
1 1 5 2012-11-29 11:29:03
2 2 10 2012-11-29 11:38:12
3 1 10 2012-12-02 05:15:01
4 3 5 2012-12-02 09:51:34
5 2 5 2012-12-02 12:14:14
6 3 5 2012-12-04 12:18:30
7 1 5 2012-12-05 06:00:51
所以我想选择每个用户最高点的ID,UID和POINT。 结果应该是:
ID UID POINT DATE TIME
2 2 10 2012-11-29 11:38:12
3 1 10 2012-12-02 05:15:01
6 3 5 2012-12-04 12:18:30
我试过这个:
SELECT distinct uid, point, id FROM `test`
GROUP By uid ORDER BY date DESC, time DESC
和
SELECT id, uid, point FROM `test`
GROUP BY uid ORDER BY date DESC, time DESC
但是我得到了一些错误的结果:
4(3), 2(2), 1(1)
最佳答案
此查询将为每个用户选择最高分:
select uid, max(`points`)
from members
group by uid
这将选择用户拥有最高分的最大 id:
select uid, max(id)
from members
where (uid, `points`) in (select uid, max(`points`)
from members
group by uid)
group by uid
这是您需要的最终查询:
select members.*
from members
where (uid, id) in (
select uid, max(id)
from members
where (uid, `points`) in (select uid, max(`points`)
from members
group by uid)
group by uid)
显示:
ID UID POINT DATE TIME
2 2 10 2012-11-29 11:38:12
3 1 10 2012-12-02 05:15:01
6 3 5 2012-12-04 12:18:30
这也会给出相同的结果,而且看起来更简单:
SELECT s.*
FROM
(SELECT members.*
FROM members
ORDER BY uid, points desc, id desc) s
GROUP BY uid
我认为它会一直有效,但没有记录在案!
对最后一个查询的一点解释:MySql 允许您通过查询选择组中的非聚合字段。这里我们按 uid
分组但选择所有列:文档说非聚合列的值将是不确定的(它可以是组内的任何值)但是在事实上 MySql 只是返回第一个遇到的值。由于我们在有序子查询上应用非聚合列分组依据,因此第一个遇到的值就是您所需要的。
关于php - 选择最高的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13969014/