2011-03-25 39 views
5

我有一個觀點(很多加入的),通過日期ASC有序輸出數據。按預期工作。GROUP_CONCAT變化GROUP BY爲了

輸出類似於:

ID date   tag1 other_data 
1 25-03-2011 blue fff <= 
1 26-03-2011 red ggg 
1 27-03-2011 pink yyy 
2 25-03-2011 red yyy <= 
2 26-03-2011 orange rrr 

如果我申請一個GROUP BY ID。對於其他列,MySQL輸出每個ID的第一個找到的行。我在te文檔的某個地方讀過這個東西。

SELECT * FROM `myVIEW` 
GROUP BY `ID` 
    ID date   tag1 other_data 
    1 25-03-2011 blue fff <= 
    2 25-03-2011 red yyy <= 

現在讓我們添加一個GROUP_CONCAT(tags1

SELECT *,CONCAT_GROUP(`tag1`) AS `tags` 
FROM `myVIEW` 
GROUP BY `ID` 

因爲我套用CONCAT_GROUP結果弄奇怪。我期待:

ID date   tag1 other_data tags 
1 25-03-2011 blue fff   blue,red,pink 
2 25-03-2011 red yyy   red,orange 

的查詢返回,例如:

ID date   tag1 other_data tags 
1 26-03-2011 red ggg   blue,red,pink 
2 25-03-2011 red yyy   red,orange 

貌似GROUP_CONCAT不再保留查看訂單。這是正常的嗎?

回答

1

這是因爲MySQL不保證什麼確切的行會爲未在聚集函數中使用或不被用於分組的字段返回。

而且是明確的「成熟」的RDBMS(如postgre,SQL服務器,Oracle)不允許指定*在GROUP BY(或無結塊或任何字段GROUP BY沒有指定) - 這是偉大的「侷限性」。

5

看起來像GROUP_CONCAT不再保留VIEW命令。這是正常的嗎?

是的,這是正常的。

你不應該依賴,永遠,在返回拆散然後不聚集字段的順序。

GROUP_CONCAT有其自己的ORDER BY子句,優化程序會考慮並可以更改解析記錄的順序。

要與GROUP_CONCAT一起返回的第一條記錄,使用:

SELECT m.*, gc 
FROM (
     SELECT id, MIN(date) AS mindate, GROUP_CONCAT(tags) AS gc 
     FROM myview 
     GROUP BY 
       id 
     ) md 
JOIN m.* 
ON  m.id = md.id 
     AND m.date = md.mindate 
5

如何訂購您GROUP_CONCAT?

SELECT value1, GROUP_CONCAT(value1 ORDER BY date DESC) 
FROM table1 
GROUP BY value1; 

這就是您需要假設的語法。