WHERE 子句 IN group_concat
Posted
技术标签:
【中文标题】WHERE 子句 IN group_concat【英文标题】:WHERE clause 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函数非常慢。 谢谢,
大王。
【问题讨论】:
【参考方案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
【讨论】:
我已经稍微更新了原始问题,因为这不是我的意思。还是谢谢以上是关于WHERE 子句 IN group_concat的主要内容,如果未能解决你的问题,请参考以下文章