MySQL GROUP_CONCAT vs. COALESCE dotyczące wartości NULL
Właśnie zauważyłem, że na serwerze kolumnatable3.note
wartości sąNULL
na mojej lokalnej maszynie są to puste ciągi. Po tym żenującym odkryciu przeprowadziłem testy i wszystko działa tak samo na obu platformach.
I to właśnie produkują, jeśli mam dwie komórki, a druga zawiera wartość rzeczywistą (pierwsza toNULL
):
//1st
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `table3_note`
//var_dump(): array(2) { [0]=> string(0) "" [1]=> string(4) "Test" }
//2nd
GROUP_CONCAT(`table3`.`note`) SEPARATOR ';') AS `table3_note`
//var_dump(): array(1) { [0]=> string(4) "Test" }
Więc pierwsze zapytanie (COALESCE
) odzyskujeNULL
s jako puste ciągi, a drugie paski wszystkieNULL
wartości z zestawu wyników. (Jest to niedopuszczalne, ponieważ mam wiele tablic i muszą być zsynchronizowane.)
Oryginalny problem został rozwiązany z powodu mojego błędu. Nadal chciałbym wiedzieć dlaczegoGROUP_CONCAT
ignorujeNULL
s, nawet jeśli jest zaznaczone.
Oto zapytanie, które działa poprawnie (nie usuwa paskówNULL
s):
SELECT `table1`.*
GROUP_CONCAT(COALESCE(`table3`.`id`, '') SEPARATOR ';') AS `t3_id`,
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `t3_note`,
FROM `table1`
LEFT JOIN `table3` ON `table3`.`id` = `table1`.`id`
GROUP BY `table1`.`id`
Dlaczego więc ten ignorujeNULL
s? (Więcej opcji zapytania, które ignorująNULL
wartości znajdują się w oryginalnej sekcji pytania.)
SELECT `table1`.*
GROUP_CONCAT(`table3`.`id` SEPARATOR ';') AS `t3_id`,
GROUP_CONCAT(`table3`.`note` SEPARATOR ';') AS `t3_note`,
FROM `table1`
LEFT JOIN `table3` ON `table3`.`id` = `table1`.`id`
GROUP BY `table1`.`id`
Oryginalne pytanie (nie ważne, moje złe ...)Część mojego zapytania, która używa trzech tabel (relacja 1: n, odwzorowuję wiele wierszy ztable2
itable3
na singieltable1
rząd). Dwie możliwości pobrania wartości pojedynczej komórki:
//1st
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `table3_note`
//2nd
GROUP_CONCAT(`table3`.`note`) SEPARATOR ';') AS `table3_note`
Oba działają poprawnie na komputerze lokalnym, ale tylko na pierwszym na serwerze. Na mojej lokalnej maszynie dostaję poprawną liczbę pustych wartości tablicy przy użyciu pierwszej lub drugiej opcji (przy użyciuvar_dump()
). Na serwerze druga opcja zwraca tylko pustą tablicę, jeśli nie ma żadnych wartości na żadnymtable3_note
(jest wieletable3_id
s i inne pola nie pokazane w zapytaniu).
Więc pytanie brzmi: dlaczego? Obie funkcje twierdzą, że powrócąNULL
jeśli nie ma wartości innych niż null zgodnie z instrukcją.
Czy poniższe informacje są istotne, czy brakuje mi czegoś w instrukcji?
Komputer lokalny: MySQL Client API wersja 5.1.44Serwer: MySQL Client API wersja 5.0.51aCzy odpowiedź jest tak prosta, że serwer obsługujeCOALESCE
działają jak moja lokalna maszyna, aleGROUP_CONCAT
funkcja jest obsługiwana inaczej z powodu niezgodnych wersji interfejsu API klienta MySQL?
Mam teraz działające rozwiązanie, więc nie jest to prawdziwe pytanie w tym sensie, że muszę to naprawić. Chciałbym tylko wiedzieć, dlaczego tak jest. I czy są jakieś pułapki w używaniuCOALESCE
jak używam? Czy istnieje niebezpieczeństwo, że macierze nie będą prawidłowo zsynchronizowane podczas drukowania ich przy użyciufor
pętla? (Przynajmniej szybkie testowanie nie ujawniło żadnych problemów.)
Ostatnie notatki. Próbowałem użyć tych i innych metod (IFNULL
, IS NULL
itp.) jak zasugerowano na przykład w następujących pytaniach:
Ale wynik był taki sam: działa na lokalnej maszynie, ale nie na serwerze. Zapytania poniżej:
//another option for the query
IF(SUM(`table3`.`note` IS NULL) = 0, GROUP_CONCAT(`table3`.`note` SEPARATOR ';'), NULL) AS `table3_note`
//and another one...
ISNULL(GROUP_CONCAT(`table3`.`note` SEPARATOR ';'), '') AS `table3_note`
Podręcznik MySQL również mówi:
O ile nie zaznaczono inaczej, funkcje grupy ignorują wartości NULL.
Czy to znaczyCOALESCE
nie ignorujeNULL
wartości takie jakGROUP_CONCAT
robi, nawet jeśli jest zaznaczone? To nadal nie wyjaśnia różnych zachowań serwera i lokalnej maszyny. Czy to robi?