2011-08-18 50 views
1

我有这个表ORDER BY子查询GROUP BY加入转换

id | title | amount | timestamp 
1 | random1 | 150 | 1313635011 
2 | random2 | 190 | 1313635730 
3 | random2 | 210 | 1313637359 
4 | random2 | 100 | 1313691807 
5 | random3 | 130 | 1313692673 
6 | random4 | 900 | 1313692739 
7 | random4 | 111 | 1313692988 

我想这个结果(用不同的头衔和最大时间戳行):

id | title | amount | timestamp 
1 | random1 | 150 | 1313635011 
4 | random2 | 100 | 1313691807 
5 | random3 | 130 | 1313692673 
7 | random4 | 111 | 1313692988 

我有这个疑问。

SELECT * FROM (
    SELECT * FROM table ORDER BY timestamp DESC 
) m GROUP BY title 

它作为魅力,但可以将它转换为JOIN语句吗?

感谢

+0

你到底需要什么?给定标题的最大时间戳? –

+0

只有一张桌子,你想加入什么? –

+0

** **不同**标题的最大时间戳。这个查询很好用,但我很好奇它是否可以转换成JOIN语句 –

回答

3

这可以简化为以下(在子查询的ORDER BY是无用的):

SELECT * 
FROM table 
GROUP BY title 

为什么你认为你需要JOIN? (好的,这是通过评论解决的)。


您的评论之后,你需要为每个标题,用最大时间戳行,这将做的工作:

SELECT t.* 
FROM 
    table AS t 
    JOIN 
    (SELECT title 
      , MAX(timestamp) AS maxts 
     FROM table 
     GROUP BY title 
    ) AS grp 
    ON grp.title = t.title 
    AND grp.maxts = t.timestamp 
ORDER BY t.timestamp DESC 

根据记录,原始查询:

SELECT * 
FROM 
    (SELECT * 
    FROM table 
    ORDER BY timestamp DESC 
) m 
GROUP BY title 

可能按预期工作,但:o在MySQL中只有,允许您在SELECT列表字段中使用不在GROUP BY子句中的列表字段(或依赖于这些字段),而没有任何集合函数。因此,上述查询将为每个标题返回一个或多或少的随机行。实际上,它将返回它将为标题找到的第一行。因此,首先运行子查询(由timestamp DESC命令)会导致首先找到具有最大时间戳的行。

但是,这只是因为(当,如果)优化器不明白子查询是无用的。您可能会发现,当您升级到MySQL版本7.5并且您的查询像以前一样停止工作时,原始查询运行正常。 (因为优化器变得更加聪明,并且将查询翻译成更简单而没有子选择)。

您甚至可能会发现您的查询完全停止工作,并且如果MySQL在未来发行版中决定与GROUP BY查询的SQL标准一致,则会产生错误。

+0

是的,我需要它按最大时间戳排序..这将给我的结果与完全相反的顺序 –

+0

因此,添加'ORDER BY t.timestamp DESC' –

+0

谢谢ypercube,你是绝对正确的,我有点理解,在MySQL中,这个数组非常随机,而且我的查询不适合我的头,所以我问了SO的帮助! 再次感谢 –

0

sql语句无效。

ORDER BY是在子查询无效

GROUP BY需要一个聚合函数,如COUNT,SUM等

SELECT COUNT(*) FROM table 
GROUP BY title 
ORDER BY title 
+2

'SELECT * FROM表GROUP BY字段'在MySQL中有效...... –

+0

而且'SELECT title FROM表GROUP BY标题'是有效的SQL(一般情况下)。 –

+0

好的,我现在看到了mysql标签。很高兴知道。上面的查询拒绝在SQL Server中运行。 –