【问题标题】:One table, two column MYSQL query challenge一表两列MYSQL查询挑战
【发布时间】:2010-06-21 07:36:50
【问题描述】:

考虑一个名为“cmets”的 MYSQL 表,它有 2 列“主机名”和“用户名”。

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

如果我这样做了

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

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

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

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

    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 @Justin:做一个更好的测试,GROUP_CONCAT (dev.mysql.com/doc/refman/5.0/en/…) 将最终返回与主机名关联的所有用户名。
    • 是的,这样做(GROUP_CONCAT)太棒了。我没有尝试上面的 oracle 测试代码,但也谢谢你。
    • group_concat 确实是您所需要的。默认情况下,此函数将其结果限制为 1024 个字符。如果需要更多,可以将 group_concat_max_len 变量设置为更高的值。 dev.mysql.com/doc/refman/5.0/en/… 如果你需要不同的分隔符,你可以做GROUP_CONCAT(DISTINCT username separator ', ')
    【解决方案2】:

    您必须添加一个新的user-defined aggregate function,它将收集的用户名字符串连接起来。

    我会试一试: http://www.codeproject.com/KB/database/mygroupconcat.aspx

    【讨论】:

      【解决方案3】:
      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 中运行良好。

      【讨论】:

      • 为 mysql 请求解决方案(在 dev.mysql.com/doc/refman/5.1/en 中搜索 XMLAGG 没有结果;mysql 有 GROUP_CONCAT,它以有效的方式完成了请求)
      • 你说得对,该解决方案仅适用于 MYSQL,但我认为发布 Oracle 10G R2 解决方案会很有趣 ;-)
      • 对于不需要或不使用 Oracle 的人(阅读:几乎任何人)来说并不是那么有趣。如果我愿意的话,我可能会找到一个楔形打油诗,但谁甚至能够破译它,更不用说关心了?
      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 2016-06-26
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      相关资源
      最近更新 更多