2012-12-20 118 views
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,其中点是每个用户的最高点。 结果应该是:

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) 
+0

你能不能在适当的列ID中显示你的预期结果?是不是'max'后跟'max()'? – bonCodigo

+0

我编辑的开幕帖子(补充说:结果应该是:...) – Gery

+0

所以你需要你的数据采取日期,时间考虑? – bonCodigo

回答

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

+0

似乎可以在几个名称更改后确定 – Gery

+0

我喜欢简单但它太简单工作,但它看起来工作:)谢谢 – Gery

+0

@Gery我编辑了一点我的答案,解释为什么最后一个查询没有记录,以及为什么我相信它将始终工作! – fthiella

1

试试这个:

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

我得到了错误的结果,在uid为3的情况下,ID将会是4的insted 6 – Gery

3

尝试:

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

给出错误结果。 –

+0

我只得到1行(但我有3个用户,所以应该是3行):id/uid/MAX(point):4/3/5(增加:结果应该是:...格式类型在我的开头张贴)或更改为3错误也是错误的结果 – Gery

+0

试过查询在我的文章和工作。我确实在TIMESTAMP列中结合了DATE&TIME列。 SELECT id,uid,MAX(point)FROM'test' GROUP BY uid ORDER BY date DESC – ennovativemedia

0

这是正确的:

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

相同:在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 
; 

Reusults:

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 
+0

在哪里UID是3的ID应该是6,因为最新插入的行是6(点是相同的) – Gery

+0

@Gery只是不符合你更新的预期结果。你最好用fthiela和justin。 +1的问题。 – bonCodigo

1

查询:

SQLFIDDLEEXample

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

看起来也可以... – Gery

0

就算这样简单:

SELECT * FROM (SELECT * FROM `points` ORDER BY point DESC) AS `t1` GROUP BY uid; 
+0

不是那么容易:) – Gery

+0

在那里,看起来很简单的权利! – andho

+0

'订单通过uid,点desc,id desc'就像我的回答是更好的:)它会工作,我使用这个技巧很多,即使它没有记录 – fthiella

0

SELECT MAX(点),ID,UID来自测试 GROUP BY UID ORDER BY点DESC

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