WHERE子句IN group_concat

时间:2010-11-28 17:38:56

标签: mysql group-concat

我有以下查询:

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(作业SEPARATOR','),在实际的表中,很容易就会有1000个无用的,这会使爆炸功能失效非常慢。 谢谢,

lordstyx。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您还可以使用IF()

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

答案 2 :(得分:0)

 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