【问题标题】:WHERE clause IN group_concatWHERE 子句 IN group_concat
【发布时间】:2011-05-16 22:22:14
【问题描述】:

我有以下查询:

SELECT name, GROUP_CONCAT(job SEPARATOR ','),
    count(*) FROM users GROUP BY name ORDER BY name ASC

是否可以只连接不包含''的工作字段,如果可以怎么办?我不能做 WHERE 子句,因为我仍然需要那些没有“工作”的子句。

如下表:

+-------+----------+
| name  | job      |
+-------+----------+
| Bob   | doctor   |
| Bob   | teacher  |
| Frank | dentist  |
| Tom   |          |
| Tom   |          |
| Tom   |          |
| Tom   |          |
| Tom   | salesman |
+-------+----------+

当前查询将导致:

+--------+---------------------------------+----------+
| name   | GROUP_CONCAT(job SEPARATOR ',') | count(*) |
+--------+---------------------------------+----------+
| Bob    | doctor, teacher                 | 2        |
| Frank  | dentist                         | 1        |
| Tom    | ,,,,salesman                    | 5        |
+--------+---------------------------------+----------+

但我希望它是:

+--------+---------------------------------+----------+
| name   | GROUP_CONCAT(job SEPARATOR ',') | count(*) |
+--------+---------------------------------+----------+
| Bob    | doctor,teacher                  | 2        |
| Frank  | dentist                         | 1        |
| Tom    | salesman                        | 5        |
+--------+---------------------------------+----------+

(不要介意这张表的逻辑,只是一个简单的例子,让事情变得清晰)

原因是,我要在php中对GROUP_CONCAT(job SEPARATOR ',')进行explode(),而在实际表中,很容易有1000个无用的,,'s,这会使explode函数非常慢。 谢谢,

大王。

【问题讨论】:

    标签: mysql group-concat


    【解决方案1】:

    你也可以使用IF():

    SELECT name, GROUP_CONCAT( if(job = '', null, job) SEPARATOR ','),
        count(*) FROM users GROUP BY name ORDER BY name ASC
    

    【讨论】:

      【解决方案2】:

      我找到了一个解决方案:我不会将作业设为 '',而是将字段设为 Null,然后查询会忽略它。

      【讨论】:

        【解决方案3】:
         SELECT name, GROUP_CONCAT(job SEPARATOR ',') FROM USERS
            WHERE job IS NULL OR job NOT LIKE '%,%'
            GROUP BY name ORDER BY name ASC
        

        但是,最好将逗号替换为其他字符串,然后包含所有作业:

         SELECT name, GROUP_CONCAT(REPLACE(job, ',', ';')) FROM USERS
            GROUP BY name ORDER BY name ASC
        

        【讨论】:

        • 我已经稍微更新了原始问题,因为这不是我的意思。还是谢谢
        猜你喜欢
        • 2022-01-08
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多