一个表,两列MYSQL查询挑战

考虑一个名为“comments”的MYSQL表,其中包含两列“主机名”和“用户名”。

如何返回按主机名排序的列表,其中第二列是与每个主机名关联的用户名列表? 我可以看到如何用py这样的脚本语言来做到这一点,但它可能作为标准的SQL查询吗?

如果我做

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

我得到了几乎正确的结果,除了它只给出了与每个主机名关联的用户名数量,而不是与每个主机名关联的实际用户名列表......尝试使用不带count()的独立(用户名)返回语法错误。


我认为最简单的方法就是在必要时选择不同的行并在客户端重新格式化它:

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

您必须添加一个新的用户定义的聚合函数,它将所收集的用户名字符串连接起来。

我会给这个镜头:http://www.codeproject.com/KB/database/mygroupconcat.aspx


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中运行良好。

链接地址: http://www.djcxy.com/p/30511.html

上一篇: One table, two column MYSQL query challenge

下一篇: Count of distinct rows with duplicate email IDs