Cláusula WHERE en GROUP_CONCAT
-
28-09-2019 - |
Pregunta
Tengo la siguiente consulta:
SELECT name, GROUP_CONCAT(job SEPARATOR ','),
count(*) FROM users GROUP BY name ORDER BY name ASC
¿Es posible solamente concat los campos de trabajo que no contienen '', y si es así cómo? No puedo hacer una cláusula WHERE, porque todavía tengo que aquellas que no tienen un 'trabajo'.
Imagen de la siguiente tabla:
+-------+----------+
| name | job |
+-------+----------+
| Bob | doctor |
| Bob | teacher |
| Frank | dentist |
| Tom | |
| Tom | |
| Tom | |
| Tom | |
| Tom | salesman |
+-------+----------+
La consulta actual resultaría en:
+--------+---------------------------------+----------+
| name | GROUP_CONCAT(job SEPARATOR ',') | count(*) |
+--------+---------------------------------+----------+
| Bob | doctor, teacher | 2 |
| Frank | dentist | 1 |
| Tom | ,,,,salesman | 5 |
+--------+---------------------------------+----------+
Pero yo quiero que sea:
+--------+---------------------------------+----------+
| name | GROUP_CONCAT(job SEPARATOR ',') | count(*) |
+--------+---------------------------------+----------+
| Bob | doctor,teacher | 2 |
| Frank | dentist | 1 |
| Tom | salesman | 5 |
+--------+---------------------------------+----------+
(no le importa la lógica de esta tabla. Es sólo un ejemplo sencillo para dejar las cosas claras)
La razón de esto es, voy a explotar () la GROUP_CONCAT (separador de trabajos', ') en php, y en la tabla real, allí fácilmente será inútil 1000 ,,' s y esto haría que la función de explotar muy lento. Gracias,
lordstyx.
Solución
He encontrado una solución:. En lugar de hacer el trabajo '', voy a hacer que el campo nulo, y la consulta ignora
Otros consejos
También puede utilizar IF()
:
SELECT name, GROUP_CONCAT( if(job = '', null, job) SEPARATOR ','),
count(*) FROM users GROUP BY name ORDER BY name ASC
SELECT name, GROUP_CONCAT(job SEPARATOR ',') FROM USERS
WHERE job IS NULL OR job NOT LIKE '%,%'
GROUP BY name ORDER BY name ASC
Sin embargo, usted podría ser mejor aconsejó cadena de reemplazar la coma a otra cosa y luego incluir todos los puestos de trabajo:
SELECT name, GROUP_CONCAT(REPLACE(job, ',', ';')) FROM USERS
GROUP BY name ORDER BY name ASC