2011-08-18 44 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中運行。 –