2012-04-26 8 views
20

Czy istnieje opcja, aby funkcja Group_Concat w MySQL zawierała wartości null?MySQL GROUP_CONCAT z wartościami Null

Rozważmy następujący przykład z mojego tabeli źródłowej:

userId, questionId, selectionId 
7, 3, NULL 
7, 4, 1 
7, 5, 2 

Podczas kwerendy w tabeli wyboru z GROUP_CONCAT, mam następujące:

7, 4=1,5=2 

Chciałbym uzyskać następujące:

7, 3=NULL,4=1,5=2 

Dla porównania, moja kwerenda wygląda następująco:

Select userId, GROUP_CONCAT(CONCAT(questionId, '=', selectionId)) 
From selection 
Group by userId; 

Próbowałem też dodanie IFNULL tak:

Select userId, GROUP_CONCAT(IFNULL(CONCAT(questionId, '=', selectionId), 'NULL')) 
From selection 
Group by userId; 

ale produkowane następujące:

7, NULL,4=1,5=2 

Uwaga - Jest jeszcze jedna złożoność że zapomniałem dołączyć. Identyfikator selekcji jest kluczem obcym do innej tabeli. Używam lewego zewnętrznego sprzężenia do tabeli selection_text. Moje prawdziwe zapytanie zawiera pola z tej tabeli (te pola są ustawiane na NULL, ponieważ identyfikator selectionId ma wartość NULL).

+0

Wyprodukuj, co powinno, spróbuj IFNULL na selekcji Id, a nie na CONCAT. – piotrm

+0

To zadziałało. Dzięki. – David

+0

Ale ogólnie rzecz biorąc - unikaj użycia konkordatu grupowego! – IcedDante

Odpowiedz

22

Należy tylko IFNULL kolumna, które mogą być NULL;

SELECT userId, GROUP_CONCAT(CONCAT(questionId, '=', 
       IFNULL(selectionId, 'NULL'))) 
FROM selection 
GROUP BY userId; 

Demo here.

+0

Po prostu miałem ten problem. Niesamowita odpowiedź. Dziś nauczyłem się czegoś nowego :) – b3tac0d3

2

Należy użyć IFNULL lub COALESCE od wartości selectionId bezpośrednio:

SELECT 
    userId, 
    GROUP_CONCAT(CONCAT(questionId, '=', COALESCE(selectionId, 'NULL'))) 
FROM selection 
GROUP BY userId;