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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top