2012-02-29 17 views
6

Ayer formulé una pregunta sobre cómo extraer múltiples resultados en un campo y se me dio la respuesta GROUP_CONTACT().GROUP_CONCAT sacando resultados vacíos con delimitadores

He puesto esto en mi código y funciona bien. Necesito hacer esto para dos campos y, por lo tanto, ahora he empezado a usarlo dos veces en la misma declaración sql. Desafortunadamente, está retirando una lista vacía para el segundo campo con comas y no estoy muy seguro de por qué.

Aquí es mi datos de producto de muestra:

pid || prod 
1 || top 
2 || sweater 

Aquí es mis datos de ejemplo stock (algunas acciones no tiene dos tamaños, por ejemplo, la cintura y el pecho):

sid || size1 || size2 || pid 
1 || M  ||  || 1 
2 || L  ||  || 1 
3 || XL ||  || 1 
4 || L  ||  || 2 
5 || XL ||  || 2 

Aquí está mi código :

SELECT p.id, GROUP_CONCAT(s.size1) size1, GROUP_CONCAT(s.size2) size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 

Esto es lo que debe llevar a cabo:

pid || size1 || size2 || prod 
1 || M,L,XL ||  || top 
2 || L,XL ||  || sweater 

Esto es lo que en realidad está llevando a cabo:

pid || size1 || size2 || prod 
1 || M,L,XL || ,, || top 
2 || L,XL || ,  || sweater 

He comprobado para ver si hay un espacio o nada en tamaño 2 y no hay nada allí.

me hicieron esta consulta y el producto volvió como yo esperaba:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 = "" 

Cuando hice esta consulta, nada volvió:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 IS NULL 

GROUP_CONCAT() ignorará resultados nulos pero necesita hacer algo para evitar que GROUP_CONTACT() muestre una lista delimitada por comas vacía cuando es solo "" en lugar de NULL.

Respuesta

16
SELECT p.id, GROUP_CONCAT(s.size1) size1, 
GROUP_CONCAT(if (s.size2 ='', null, s.size2)) as size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 
2

intente esto:

SELECT 
    p.id, 
    GROUP_CONCAT(s.size1) size1, 
    GROUP_CONCAT(case when s.size2='' then null else s.size2 end) size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 
0

¿Ha intentado utilizar GROUP_CONCAT(DISTINCT column)? Desde mi comprensión de la documentación, debería dar como resultado una cadena vacía tal como lo desea.

El DISTINCT eliminaría todos los duplicados dejándolo con una sola ocurrencia de "".

7

También puede utilizar la función de NULLIF() para convertir cadenas vacías a NULL:

SELECT 
    p.id, 
    GROUP_CONCAT(  s.size1 ) AS size1, 
    GROUP_CONCAT(NULLIF(s.size2, '')) AS size2, 
    p.prod 
FROM products AS p 
    INNER JOIN stock AS s ON s.prodid = p.id 
GROUP BY 
    p.id, 
    p.prod 
;