选择最高的最后一行。

4
我希望选择每个成员的最后一行中最高的一行。
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,其中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)

你能否将期望的结果放在正确的列ID中展示出来?highest 后面不是应该跟着 max() 吗? - bonCodigo
我编辑了开头的帖子(添加了:结果应该是...) - Gery
所以你需要考虑日期和时间的数据吗? - bonCodigo
我不想打印出日期和时间,但是如果点数是一些特定的(例如:ID 4 和 6),请考虑将其考虑在内。 - Gery
您对日期有任何排序偏好吗? - andho
8个回答

3

尝试:

SELECT id, uid, MAX(point) FROM `test` GROUP BY uid ORDER BY date DESC, time DESC

我只得到了1行(但我有3个用户,所以应该有3行):id / uid / MAX(point):4/3/5(补充说明:结果应该是:...在我的开头帖子中的格式类型)或者将限制改为3也会得到错误的结果。 - Gery
在我的帖子中尝试了查询,并且成功了。我将日期和时间列合并到了一个时间戳列中。SELECT id,uid,MAX(point) FROM test GROUP BY uid ORDER BY date DESC - ennovativemedia
mysql> SELECT id, uid, MAX(point) FROM test GROUP BY uid ORDER BY date DESC; result = id 4, uid 3, MAX(point) 5 ; id 2, uid 2, MAX(point) 10 ; id 1, uid 1, MAX(point) 10 - ennovativemedia
我再次尝试,但是当UID为3时,我没有得到最新的行(在ID 4和6中情况相同,但我得到了ID 4,而最新插入的行是6)。 - Gery

3

这个查询将会选取每个用户的最高分:

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允许您在group by查询中选择非聚合字段。在这里,我们正在按uid进行分组,但选择所有列:文档说明非聚合列的值将是未确定的(可以是组内的任何值),但实际上 MySql 只返回第一个遇到的值。由于我们正在应用一个具有非聚合列的group by到有序子查询上,所以第一个遇到的值就是您需要的内容。

几次更改名称后,它似乎没问题了。 - Gery
我喜欢简单,但它太简单了,无法工作,但看起来似乎可以工作 :) 谢谢 - Gery
@Gery,我稍微编辑了一下我的答案,解释了为什么最后一个查询没有记录,并且为什么我相信它总是有效的! - fthiella

1

试试这个:

SELECT id, uid, point FROM `test` 
GROUP BY uid 
ORDER BY point DESC, date DESC, time DESC

当uid为3时,ID将会是4而不是6,我得到了错误的结果。 - Gery

1

查询:

SQLFIDDLE示例

SELECT t1.*
FROM Table1 t1 
WHERE t1.ID = (SELECT MAX(t3.ID)
               FROM Table1 t3
               WHERE t1.UID=t3.UID
               AND t3.POINT=(SELECT  MAX(t2.POINT)
                               FROM Table1 t2
                               WHERE t2.UID = t3.UID))

结果:

| ID | UID | POINT |                            DATE |     TIME |
-----------------------------------------------------------------
|  2 |   2 |    10 | November, 29 2012 00:00:00+0000 | 11:38:12 |
|  3 |   1 |    10 | December, 02 2012 00:00:00+0000 | 05:15:01 |
|  6 |   3 |     5 | December, 04 2012 00:00:00+0000 | 12:18:30 |

0

这是正确的:

SELECT ID, UID, MAX(POINT) FROM `test` GROUP BY UID ORDER BY DATE DESC, TIME DESC

相同的是:当UID为3时,ID应该为6,因为最新插入的行是6(重点在于相同)。 - Gery

0

查询:

SELECT x.*
FROM (SELECT p.*
FROM points p
ORDER BY uid, point desc, id desc) as x
GROUP BY x.uid
;

结果:

ID  UID     POINT   DATE                                TIME
3   1       10      December, 02 2012 00:00:00+0000     January, 01 1970 05:15:01+0000
2   2       10      November, 29 2012 00:00:00+0000     January, 01 1970 11:38:12+0000
6   3       5       December, 04 2012 00:00:00+0000     January, 01 1970 12:18:30+0000

еЅ“UIDдёє3ж—¶пјЊIDеє”дёє6пјЊе› дёєжњЂж–°жЏ’е…Ґзљ„иЎЊдёє6пј€й‡Ќз‚№з›ёеђЊпј‰гЂ‚ - Gery
@Gery 刚刚注意到你更新了预期结果。与 fthiela 和 justin 合作效果更好。对这个问题点赞。 - bonCodigo

0
简单如下:
SELECT * FROM (SELECT * FROM `points` ORDER BY point DESC) AS `t1` GROUP BY uid;

按照 uid、points 降序和 id 降序排序,就像我的答案中所示的那样更好 :) 它可以工作,我经常使用这个技巧,即使它没有被记录在文档中。 - fthiella
是啊,我也是,但最近没有做任何SQL。 - andho

0

从test表中选择最大的point、id和uid,按照point降序排列,并按照uid分组。

以这种方式使用,它将解决你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接