2010-03-11 62 views
3

我有多个用户与多个条目的目的地SQL组和秩序

不知怎的,记录他们到达时,我选择查询我想只显示每个唯一的用户名最新的条目。

这里是不起作用的代码:

SELECT * FROM $dbTable GROUP BY xNAME ORDER BY xDATETIME DESC 

这确实名称分组很好,但就只显示其最新的条目,只是表示它看到在SQL中的第一项表。

我想我的问题是,这可能吗?

这里是我的数据样本:

john 7:00 
chris 7:30 
greg 8:00 
john 8:15 
greg 8:30 
chris 9:00 

和我期望的结果只能是

john 8:15 
chris 9:00 
greg 8:30 
+0

我们需要看到您选择的列。 – 2010-03-11 21:35:53

+3

不要使用select *,这是你的问题,你必须告诉它什么时候分组记录。无论如何,选择*是一个糟糕的做法。它不应该出现在生产代码中。 – HLGEM 2010-03-11 21:41:02

+1

让我猜猜:MySQL?我还没有看到另一个SQL服务器,它允许你用'GROUP BY'子句'SELECT *'。另一方面,MySQL假定您想在所有不是聚合的列上分组。 – Powerlord 2010-03-11 21:42:06

回答

8

如何像

Select xName, MAX(xDATETIME) AS MaxDateVal 
FROM $dbtable 
GROUP BY xName 
ORDER BY MaxDateVal 
+0

我试图MAX xDATEIME,但它给了我表格的最新条目,而不是最新的每个独特的xNAME – 2010-03-11 21:55:30

+0

你试过提供的查询?还使用** GROUP BY **? – 2010-03-11 21:58:00

+1

是的,如果我把这个查询放在里面,我所得到的就是名字,并且这些名字没有按照输入时间排序。 – 2010-03-11 22:09:05

3
SELECT xNAME, MAX(xDATETIME) 
FROM $dbTable 
GROUP BY xNAME 
ORDER BY xDATETIME DESC 
+1

我不认为在这里需要ORDER BY,只是引擎X的额外步骤) – 2010-03-11 21:39:35

+0

+1同意,只是复制他的查询。但如果他想要它的名单,那么它会工作。 – 2010-03-11 21:43:57

+0

提供的结果似乎并没有订购什么,所以所有...再次检查 – 2010-03-11 21:48:15

0
SELECT MAX(xNAME), MAX(xDATETIME) FROM $dbTable GROUP BY xNAME ORDER BY xDATETIME DESC 
+1

MAX(xNAME)'?我不认为你可以在你在GROUP BY中指定的列上调用MAX。 – Powerlord 2010-03-11 21:40:25

+0

** MAX(xName)?**你确定。这将只返回一行... – 2010-03-11 21:41:03

+0

它应该每组返回一行,就像MAX(xDATETIME)一样。可能没有必要。 – 2010-03-11 21:42:19

2

与您的查询的问题是,当您使用GROUP BY时,您必须为不在GROUP BY子句中的字段指定聚合函数。

你可能想尝试,而不是以下:

SELECT  u.* 
FROM  users u 
INNER JOIN (
      SELECT xName, MAX(xDatetime) max_time 
      FROM  users 
      GROUP BY xName 
      ) sub_u ON (sub_u.xName = u.xName AND 
         u.xDateTime = sub_u.max_time); 

上面的查询可以测试如下:

CREATE TABLE users (id int, xName varchar(100), xDateTime datetime); 

INSERT INTO users VALUES (1, 'a', '2010-03-11 00:00:00'); 
INSERT INTO users VALUES (2, 'a', '2010-03-11 01:00:00'); 
INSERT INTO users VALUES (3, 'a', '2010-03-11 02:00:00'); 
INSERT INTO users VALUES (4, 'b', '2010-03-11 01:00:00'); 
INSERT INTO users VALUES (5, 'b', '2010-03-11 02:00:00'); 
INSERT INTO users VALUES (6, 'b', '2010-03-11 03:00:00'); 
INSERT INTO users VALUES (7, 'c', '2010-03-11 06:00:00'); 
INSERT INTO users VALUES (8, 'c', '2010-03-11 05:00:00'); 

-- Query Result: 

+----+-------+---------------------+ 
| id | xName | xDateTime   | 
+----+-------+---------------------+ 
| 3 | a  | 2010-03-11 02:00:00 | 
| 6 | b  | 2010-03-11 03:00:00 | 
| 7 | c  | 2010-03-11 06:00:00 | 
+----+-------+---------------------+ 

如果您想订购由max_time场的结果集,只需在查询结尾添加ORDER BY u.xDateTime DESC即可。你

+1

虽然我没有尝试下面的所有回复,但是这个回应是透明的。谢谢! – 2010-03-11 22:35:45

0

还可以这样做:

Select 
    xName, xDATETIME 
from 
    $dbTable t1 
where 
    xDATETIME = 
    (select max(xDATETIME) from $dbTable t2 
    where t1.xName=t2.xName) 
order by xDATETIME DESC