2010-03-02 159 views
11

據我所知,mysql GROUP BY組找到最後一條記錄。GROUP BY返回第一條記錄

有沒有解決方案GROUP BY的第一個記錄?

我已經在SQL命令中設置了ORDER,我需要GROUP BY返回第一條記錄,而不是最後一條。

編輯

這裏是查詢

SELECT 
    DISTINCT(master.masterID), 
    langData.*, 
    master.* 
FROM master_table as master 
INNER JOIN lang_table as langData ON 
langData.masterID=master.masterID 
GROUP BY master.masterID 
ORDER BY 
CASE 
    WHEN langData.lang='currentLang' THEN 1 ELSE 999 END , 
    master.name desc LIMIT 0,10 

上面的查詢選擇masterID多語言表,並想回到先在currentLang記錄,並通過名稱爲了他們,然後所有其他語言。

不要問我爲什麼不在JOIN中設置語言。這是要完成的方式。

因此,迄今爲止一切正常,預計情況是我有一個記錄語言enfr。如果currentLangen然後根據

langData.lang='currentLang' THEN 1 ELSE 999 END 

en順序爲1和fr訂單和999不是得到的en的價值,我得到的fr值。

這就是爲什麼我想組到第一行。

+0

我不會問你爲什麼不設置在'JOIN'語言,而是我會告訴你,這種方式是行不通的。 「GROUP BY」中的未聚合表達式返回每個組的任意記錄,如果值不同,則不應使用該記錄。您可以從'master_table'返回任何記錄(它們在每個組中都是相同的),但不能從'lang_table'中返回。無法保證將返回哪條記錄,nada,niente。 '順便說一句',你爲什麼在這裏有'DISTINCT',它的目的是什麼? – Quassnoi

+0

我試圖實現「首先給我所有記錄從當前的語言順序名稱,然後爲所有其他語言按名稱排序」含義:如果當前郎是EN,然後獲取EN的所有記錄,然後獲取其他lang的所有記錄。如果在lang表中有一條記錄有EN,則FR返回EN值.IF在lang表中不存在返回任何其他lang – ntan

+0

這很容易用'JOIN'來完成,如下所述:http:// explainextended。 com/2009/08/10/fallback-language-names-mysql /但由於一些奇怪的原因(你甚至不想被要求),你不願意使用它。 – Quassnoi

回答

11

我假設你喜歡

SELECT * 
FROM mytable 
GROUP BY 
     column 

談論的東西,除非他們都在組內同樣你不應該在GROUP BY使用非聚集表達式。

如果你想返回一組中保持用於表達的至少值的記錄,使用:

SELECT mo.* 
FROM (
     SELECT DISTINCT column 
     FROM mytable 
     ) md 
JOIN mytable mo 
ON  mo.id = 
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.column = md.column 
     ORDER BY 
       mi.column, mi.someorder 
     LIMIT 1 
     ) 
1

LIMIT 1添加到您的查詢中。

+0

不可能。爲網格和分頁讀取記錄 – ntan