2012-02-29 15 views
6

Ho fatto una domanda ieri su come estrarre più risultati in un campo e mi è stata data la risposta GROUP_CONTACT().GROUP_CONCAT tirando fuori risultato vuoto con delimitatori

Ho inserito questo codice nel mio codice e funziona correttamente. Ho bisogno di fare questo per due campi e quindi ho iniziato a usarlo due volte nella stessa istruzione sql. Sfortunatamente, sta tirando indietro una lista vuota per il secondo campo con virgole e non sono sicuro del perché.

Ecco il mio dati di esempio:

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

Ecco i miei dati di esempio stock (brodo non ha due dimensioni ad esempio vita e al torace):

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

Ecco il mio codice :

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 

Questo è quello che dovrebbe mettere in evidenza:

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

Questo è quello che è in realtà portando fuori:

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

Ho controllato per vedere se c'è uno spazio o qualsiasi cosa in size2 e non c'è niente lì dentro.

ho fatto questa domanda e il prodotto è tornato come mi aspettavo:

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

Quando ho fatto questa domanda, non è tornato:

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

so GROUP_CONCAT() ignorerà risultati NULL ma io è necessario fare qualcosa per fermare GROUP_CONTACT() da mostrare un elenco delimitato da virgola vuota quando è solo "" anziché NULL.

risposta

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

provare questo:

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

Hai provato a usare GROUP_CONCAT(DISTINCT column)? Dalla mia comprensione della documentazione dovrebbe risultare in una stringa vuota proprio come tu vuoi.

Lo DISTINCT eliminerebbe tutti i duplicati lasciandovi con una sola occorrenza di "".

7

È inoltre possibile utilizzare la funzione NULLIF() per convertire le stringhe vuote per i 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 
;