2010-11-28 92 views
1

我有以下查詢:WHERE子句中GROUP_CONCAT

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

是否有可能只CONCAT不包含'的工作領域,如果是的話怎麼樣?我不能做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','),並且在實際的表中,將會容易出現1000無用的'',並且這會使爆炸功能非常慢。 謝謝,

lordstyx。

回答

2

我已經找到了解決辦法:而不是做工作「」 ,我只會將字段設爲Null,而查詢忽略它。

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 
+0

我已經更新了原來的問題了一下,因爲真的不是我的意思。不管怎麼說,多謝拉 – lordstyx 2010-11-28 18:27:10

1

您還可以使用IF()

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