一个表,两列MYSQL查询挑战

时间:2010-06-21 07:36:51

标签: sql mysql

考虑名为“comments”的MYSQL表,其中包含2列“hostname”和“username”。

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

如果我这样做

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

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

3 个答案:

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