【问题标题】:MySQL DISTINCT on a GROUP_CONCAT()GROUP_CONCAT() 上的 MySQL DISTINCT
【发布时间】:2011-03-06 05:44:13
【问题描述】:

我正在做SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table。以下示例数据:

categories
----------
test1 test2 test3
test4
test1 test3
test1 test3

但是,我收到了test1 test2 test3 test4 test1 test3 的回复,我希望获得test1 test2 test3 test4 的回复。有什么想法吗?

非常感谢!

【问题讨论】:

    标签: mysql group-concat


    【解决方案1】:

    GROUP_CONCAT 具有 DISTINCT 属性:

    SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table
    

    【讨论】:

      【解决方案2】:

      使用 DISTINCT 会起作用

      SELECT GROUP_CONCAT(DISTINCT(categories) SEPARATOR ' ') FROM table
      

      参考:- this

      【讨论】:

        【解决方案3】:

        DISTINCT: 会给你独特的价值。

        SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table
        

        【讨论】:

          【解决方案4】:

          此问题的其他答案不返回 OP 需要的内容,它们将返回如下字符串:

          test1 test2 test3 test1 test3 test4
          

          (注意 test1test3 是重复的)而 OP 想要返回这个字符串:

          test1 test2 test3 test4
          

          这里的问题是字符串"test1 test3"被复制并且只插入一次,但是所有其他的都是不同的("test1 test2 test3""test1 test3"不同,即使整个中包含一些测试字符串重复)。

          这里我们需要做的是将每个字符串拆分成不同的行,我们首先需要创建一个数字表:

          CREATE TABLE numbers (n INT);
          INSERT INTO numbers VALUES
          (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
          

          然后我们可以运行这个查询:

          SELECT
            SUBSTRING_INDEX(
              SUBSTRING_INDEX(tableName.categories, ' ', numbers.n),
              ' ',
              -1) category
          FROM
            numbers INNER JOIN tableName
            ON
              LENGTH(tableName.categories)>=
              LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1;
          

          我们得到这样的结果:

          test1
          test4
          test1
          test1
          test2
          test3
          test3
          test3
          

          然后我们可以应用 GROUP_CONCAT 聚合函数,使用 DISTINCT 子句:

          SELECT
            GROUP_CONCAT(DISTINCT category ORDER BY category SEPARATOR ' ')
          FROM (
            SELECT
              SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category
            FROM
              numbers INNER JOIN tableName
              ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1
            ) s;
          

          请看小提琴here

          【讨论】:

          • 看来您对 OP 问题的解释可能是正确的;但是,我认为应该指出,通过为适当的多对多关系创建“blah_to_categories”和“categories”表来规范化数据将是这里的最佳实践,并且会增加很多灵活性。尽管如此,对于继承这种非规范化模式的任何人来说,您的答案都是一个聪明的解决方法。它也可能适用于生成从旧模式到规范化模式的迁移。
          【解决方案5】:

          您可以在前面简单地添加DISTINCT

          SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')
          

          如果要排序,

          SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
          

          【讨论】:

            【解决方案6】:
            SELECT
              GROUP_CONCAT(DISTINCT (category))
            FROM (
              SELECT
                SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category
              FROM
                numbers INNER JOIN tableName
                ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1
              ) s;   
            

            这将返回不同的值,例如:test1,test2,test4,test3

            【讨论】:

              猜你喜欢
              • 2013-09-21
              • 2013-04-12
              • 2021-01-30
              • 1970-01-01
              • 1970-01-01
              • 2014-07-11
              • 2016-05-26
              • 2020-11-14
              相关资源
              最近更新 更多