2010-06-21 98 views
2

考慮一個名爲「comments」的MYSQL表,其中包含2列「主機名」和「用戶名」。一張表,兩列MYSQL查詢挑戰

如何返回按主機名排序的列表,其中第二列是與每個主機名關聯的用戶名列表?我可以看到如何用py這樣的腳本語言來做到這一點,但它可能作爲標準的SQL查詢嗎?

如果我做

SELECT hostname, count(distinct(username)) 
FROM comments 
GROUP BY hostname 

我幾乎得到正確的結果,但它只是給了我與每個主機名代替每個主機名關聯的用戶名的實際列表關聯的用戶名的號碼...嘗試不同(用戶名)沒有計數()周圍它返回一個語法錯誤。

回答

3

我認爲這樣做最徹底的方法是隻選擇不同行,必要時重新格式化它在客戶端:

SELECT DISTINCT hostname, username 
FROM comments 
ORDER BY hostname, username 

另外,如果你想連接起來,您可以使用GROUP_CONCAT結果:

SELECT hostname, GROUP_CONCAT(DISTINCT username) as usernames 
FROM comments 
GROUP BY hostname 
+1

很酷,我不知道GROUP_CONCAT!你怎麼能「打開它」? – 2010-06-21 07:45:46

+1

評論已刪除...你們這些人非常快。謝謝,我正在嘗試這些建議。 – 2010-06-21 07:46:37

+1

+1 @Justin:做一個更好的測試,GROUP_CONCAT(http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)將確切返回所有與用戶名相關的用戶名主機名。 – Unreason 2010-06-21 07:52:39

-1
SELECT HOSTNAME, 
     RTRIM(
      REPLACE(
       REPLACE(XMLAGG(XMLELEMENT("x", USERNAME)).getstringval(), '<x>', NULL), 
       '</x>', 
       ',' 
     ), 
      ',' 
    ) LIST_OF_USERNAMES 
FROM COMMENTS 
GROUP BY HOSTNAME; 

實施例:

如果源表是:

HOSTNAME  USERNAME 
10.12.110.80 GOOFY 
10.12.110.80 MINNIE 
10.12.110.81 STAR 
10.12.110.81 MOON 
10.12.110.81 SUN 
10.12.110.82 MARMELADE 
10.12.110.82 ORANGE 
10.12.110.82 JUICE 
10.12.110.82 LEMON 

輸出將是如下:

HOSTNAME  LIST_OF_USERNAMES 
10.12.110.80 GOOFY,MINNIE 
10.12.110.81 STAR,MOON,SUN 
10.12.110.82 MARMELADE,ORANGE,JUICE,LEMON 

它在Oracle 10G R2中正常運行。

+1

該解決方案需要mysql(在http://dev.mysql.com/doc/refman/5.1/en/中搜索XMLAGG,不會產生任何結果; mysql具有GROUP_CONCAT,它可以高效地完成請求) – Unreason 2010-06-21 07:53:05

+0

你是對的,該解決方案僅針對MYSQL,但我認爲這將是有趣的發佈Oracle 10G R2解決方案;-) – UltraCommit 2010-06-21 07:54:32

+1

對於不需要或不使用Oracle的人來說,這並不是那麼有趣(閱讀:幾乎任何人)。如果我喜歡它,我可能會找到一個楔形的打油詩,但誰甚至可以破譯它,更不用說小心了? – cHao 2010-06-21 09:46:48