考虑名为“comments”的MYSQL表,其中包含2列“hostname”和“username”。
如何返回按主机名排序的列表,其中第2列是与每个主机名关联的用户名列表?我可以看到如何使用像py这样的脚本语言来实现这一点,但它是否可以作为标准的SQL查询?
如果我这样做
SELECT hostname, count(distinct(username))
FROM comments
GROUP BY hostname
我得到了几乎正确的结果,除了它只给了我与每个主机名相关联的用户名的数量,而不是与每个主机名相关联的实际用户名列表...尝试使用不包含count()的distinct(用户名)返回语法错误。
答案 0 :(得分: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 :(得分:1)
您必须添加新的user-defined aggregate function,它会连接收集的用户名字符串。
我会对此有所了解: http://www.codeproject.com/KB/database/mygroupconcat.aspx
答案 2 :(得分:-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中运行良好。