2013-03-15 62 views
0

比方说,我有以下两个条目:GROUP BY最大mysql中

`id`  | `timestamp` | `content` | `reference` 
1  |  2012-01-01 | NEWER  | 1 
2  |  2013-01-01 | NEWEST  | 1 
3  |  2011-01-01 | OLD  | 2 

我需要从我的查询结果如下:

`id`  | `timestamp` | `content` | `reference` 
2  |  2013-01-01 | NEWEST  | 1 
3  |  2011-01-01 | OLD  | 2 

这里就是我有这么远,但它是不正确:

SELECT * FROM table GROUP BY reference 

什么是正确的查询在这里?

我正在寻找每个参考ID最新的content。在上面的示例中,有两个引用ID(1 & 2),我想获取每个引用的最新条目。

+1

你能有什么话你期待描述。你的数据样本并不明显。 – 2013-03-15 23:54:14

+0

请参阅最新的回复。 – David542 2013-03-15 23:55:21

+0

如果您可以将您的模式和测试数据放在SQLFiddle(对于所有这样的问题),这对读者会非常有帮助。 – halfer 2013-03-16 00:00:39

回答

1
SELECT * 
FROM (SELECT * FROM table ORDER BY timestamp desc) as sub 
GROUP BY reference 

如果你想扩展查询,把限制逻辑到子查询,像这样有更好的表现:

SELECT * 
FROM (SELECT * 
     FROM table 
     WHERE 1=1 and 2=2 
     ORDER BY timestamp desc 
    ) as sub 
GROUP BY reference 
+0

出于好奇,为什么把'WHERE 1 = 1 AND 2 = 2'放在查询中更有效率? – David542 2013-03-16 03:35:21

+0

另外,你是否比执行'IN'查询表现更好?(就像其他两个答案一样)?如果是这样,为什么? – David542 2013-03-16 03:35:59

+0

我并不是建议你使用'1 = 1',但是如果你使用'where content ='old''来限制结果,那么这些属于内部查询。嵌套查询和“IN”语句具有相同的性能。 – 2013-03-18 20:31:58

0

我想你需要最新的每个参考的?事情是这样的:

SELECT * FROM my_table 
WHERE id IN (
    SELECT id FROM my_table ORDER BY timestamp DESC GROUP BY reference LIMIT 1 
); 
+0

Gah,这不会起作用 - 'id'不是子选择中的GROUP BY的一部分。没时间进一步研究,但希望它能给你提供点子! – halfer 2013-03-15 23:59:41

0
select * from table where reference_id in 
    (select max(id) from table group by reference)