Php 选择最高的最后一行
我想选择每个成员的最后一行Php 选择最高的最后一行,php,mysql,sql,Php,Mysql,Sql,我想选择每个成员的最后一行 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
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和每个用户中最高的点。
结果应该是:
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
及
但我得到了一些错误的结果:
4(3), 2(2), 1(1)
试试这个:
SELECT id, uid, point FROM `test`
GROUP BY uid
ORDER BY point DESC, date DESC, time DESC
尝试:
这是正确的:
SELECT ID, UID, MAX(POINT) FROM `test` GROUP BY UID ORDER BY DATE DESC, TIME DESC
此查询将为每个用户选择最高点:
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只返回遇到的第一个值。由于我们在一个有序子查询上应用了带有未聚合列的group by,因此遇到的第一个值就是您需要的值。- :从第一个答案更新以匹配预期结果
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
查询:
SELECT x.*
FROM (SELECT p.*
FROM points p
ORDER BY uid, point desc, id desc) as x
GROUP BY x.uid
;
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 |
就这么简单:
SELECT * FROM (SELECT * FROM `points` ORDER BY point DESC) AS `t1` GROUP BY uid;
从测试中选择最大值(点)、id、uid
按uid分组
按点顺序描述
以这种方式使用,它将解决您的问题。您能在适当的列ID中显示您的预期结果吗?是不是最高的
后面紧跟着max()
?我编辑了开场白(添加:结果应该是:…),所以你需要你的数据来考虑日期、时间?我不想打印日期和时间,但如果是某个点(例如:ID 4和6),你喜欢日期的顺序吗?我只得到1行(但我有3个用户,所以应该是3行):id/uid/MAX(point):4/3/5(添加:结果应该是:…我的开场白中的格式类型)或将lmit更改为3也是错误的结果)在我的帖子中尝试了查询并成功。我将日期和时间列合并到时间戳列中。从test
GROUP BY uid ORDER BY date DESCmysql>中选择id、uid、MAX(point)从test
GROUP BY uid ORDER BY date DESC中选择id、uid、MAX(point);结果=id 4,uid 3,最大(点)5;id 2,uid 2,最大(点)10;id 1,uid 1,MAX(point)10我再试了一次,但是当uid为3时,我得到的不是最新的一行(id 4和6中的点相同,但我得到的是id 4,但最新插入的行是6I得到错误的结果,当uid为3时,id将是4而不是6,当uid为3时,id应该是6,因为最新插入的行是6(point是相同的)@Gery刚刚没有收到你的最新预期结果。你与fthiela和justin相处得更好。问题是+1。在几个名字改变后似乎还可以。我喜欢简单,但它太简单了,无法工作,但看起来可以工作:)谢谢you@Gery我编辑了一点我的答案,来解释为什么最后一个查询没有记录,为什么我相信它会一直有效!相同:如果UID是3,ID应该是6,因为最新插入的行是6(点是相同的)orderbyUID,points desc,ID desc
就像在我的答案中那样更好:)它会起作用,我经常使用这个技巧,即使它没有被记录是的,我也是,但最近没有做任何SQL。
SELECT * FROM (SELECT * FROM `points` ORDER BY point DESC) AS `t1` GROUP BY uid;