2010-11-28 6 views
1

J'ai la requête suivante:clause WHERE IN group_concat

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

Est-il possible de ne concat les domaines d'emploi qui ne contiennent pas « », et si oui comment? Je ne peux pas faire une clause WHERE, parce que j'ai encore besoin de ceux qui n'ont pas de 'job'.

image le tableau suivant:

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

La requête actuelle se traduirait par:

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

Mais je veux que ce soit:

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

(Ne prêtez pas attention logique de cette table, c'est juste un exemple simple pour clarifier les choses)

Raison pour cela, je vais exploser() le GROUP_CONCAT (travail SEPARATOR ',') en PHP, et dans le tableau actuel, il y aura facilement 1000 inutiles, et cela ferait la fonction exploser très lent. Merci,

lordstyx.

Répondre

2

J'ai trouvé une solution: au lieu de faire le travail « » , Je vais juste faire le champ Null, et la requête l'ignore.

0
SELECT name, GROUP_CONCAT(job SEPARATOR ',') FROM USERS 
    WHERE job IS NULL OR job NOT LIKE '%,%' 
    GROUP BY name ORDER BY name ASC 

Cependant, vous pourriez être mieux conseillé de remplacer la virgule chaîne à quelque chose d'autre et inclure tous les travaux:

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

J'ai mis à jour la question initiale un peu, parce que ce n'est pas vraiment ce que je veux dire. Merci quand même – lordstyx

1

Vous pouvez également utiliser IF():

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