MySQL GROUP_CONCAT vs. COALESCE dotyczące wartości NULL

AKTUALIZACJA

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) odzyskujeNULLs 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 ignorujeNULLs, nawet jeśli jest zaznaczone.

Oto zapytanie, które działa poprawnie (nie usuwa paskówNULLs):

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 ignorujeNULLs? (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_ids 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ą.

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalescehttp://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

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.51a

Czy 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:

GROUP_CONCAT zwraca NULL, jeśli dowolna wartość jest NULLNie zwrócono wierszy o wartości NULL dla group_concat

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?

questionAnswers(1)

yourAnswerToTheQuestion