2016-12-02 131 views
0

我試圖獲取組中的最高版本。我查詢:SQL:Group By不匹配記錄

SELECT 
    rubric_id, 
    max(version) as version, 
    group_id 
FROM  
    rubrics 
WHERE 
    client_id = 1 
GROUP BY 
    group_id 

數據:

enter image description here

結果:

enter image description here

ID 2的欄目沒有一個版本的2 ,爲什麼這是不匹配?我需要做些什麼來糾正這個問題?

編輯,不是重複:

這不是SQL Select only rows with Max Value on a Column重複,這是我寫這之前已經閱讀並引用的文章。我的問題是不是如何找到最大,我的問題是爲什麼是version不匹配正確的ID

+0

[SQL選擇只在色譜柱的最高值的行(可能的重複http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on- a-column) –

+0

@ PM77-1我實際上是參考那篇文章來指導如何完成我的目標。但是,這篇文章並不關於如何選擇列的最大值。這是關於爲什麼版本似乎不匹配,這是我明確要求的。 –

+0

你需要Google'MySQL GROUP BY Extensions'並仔細閱讀。你會明白,「* mismatch *」的原因並解決它,你將需要使用我引用的帖子中的技術。 –

回答

2

MySQL令你感到困惑,因爲讓你不必在列表中選擇一個不在你的組中的列。要解決此問題,請確保您未選擇任何不在組中的字段。

而不是試圖在一個語句中獲取所有內容,您將需要使用子查詢來查找max_version_id,然後加入到它。

SELECT T.* 
FROM rubrics T 
JOIN 
(
    SELECT 
     group_id, 
     max(version) as max_version 
    FROM  
     rubrics 
    GROUP BY 
     group_id 
) dedupe 
on T.group_id = dedupe.group_id 
and T.version_id = dedupe.max_version_id 
WHERE 
    T.client_id = 1 
+0

謝謝你的建設性和有益的解釋。我意識到我對Group By的功能有一個基本的誤解。我正在嘗試類似於您在那裏的內容,但我在內部查詢中包含了第三個字段。所以我只關注我的問題中內部查詢的結果。 –

+0

我很高興這是有幫助的。謝謝! – aaronsteers

-1

編輯:So MySQL allows it, but I don't think it's a good practise to use it

您正試圖從聚合查詢中查詢非聚合數據。你不應該那樣做。

一個GROUP BY需要的領域,應該讓行組(在你的情況,你與你的GROUP BY說的是:給我每個不同group_id結果),並給出了基於分組的結果(彙總數據) 。

在這裏,您嘗試訪問非聚合數據(在您的情況下爲rubric_id)。出於某種原因,查詢不會崩潰,並在您的聚合數據中選擇一個「隨機」ID。

+0

MySQL允許。閱讀https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html –

+0

我不知道,但爲什麼它被允許? –

+0

http://stackoverflow.com/questions/7594865/why-does-mysql-add-a-feature-that-c​​onflicts-with-sql-standards –