1

我有以下查询:

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中explode() GROUP_CONCAT(job SEPARATOR ','),而在实际的表中,很容易有1000个无用的,,'s,这会使explode函数非常慢。谢谢,

勋爵。

4

3 回答 3

2

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

于 2010-11-28T20:06:33.653 回答
1

您还可以使用IF()

SELECT name, GROUP_CONCAT( if(job = '', null, job) SEPARATOR ','),
    count(*) FROM users GROUP BY name ORDER BY name ASC
于 2013-08-14T15:25:50.617 回答
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
于 2010-11-28T17:44:40.297 回答