MySQL GROUP_CONCAT против COALESCE относительно значений NULL
Я просто заметил, что на сервере столбецtable3.note
значенияNULL
и на моей локальной машине они пустые строки. После этого смущающего открытия я провел некоторое тестирование, и все работает одинаково на обеих платформах.
И это то, что они производят, если у меня есть две ячейки, а вторая содержит фактическое значение (перваяNULL
):
//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" }
Итак, 1-й запрос (COALESCE
) восстанавливаетNULL
s как пустые строки и вторые полосы всеNULL
значения из набора результатов. (Это неприемлемо, потому что у меня много массивов, и они должны быть синхронизированы.)
Первоначальная проблема решена из-за моей ошибки. Я все еще хотел бы знать, почемуGROUP_CONCAT
игнорируемыхNULL
с, даже если проверено.
Вот запрос, который работает должным образом (не удаляетNULL
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`
Так почему этот игнорируетNULL
s? (Больше параметров запроса, которые игнорируютNULL
значения указаны в оригинальном разделе вопросов.)
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`
Original question (not important, my bad...)
Часть моего запроса, которая использует три таблицы (отношение 1: n, я отображаю несколько строк изtable2
а такжеtable3
в одиночкуtable1
строка). Две альтернативы для извлечения одного значения ячейки:
//1st
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `table3_note`
//2nd
GROUP_CONCAT(`table3`.`note`) SEPARATOR ';') AS `table3_note`
Оба прекрасно работают на локальном компьютере, но только первый на сервере. На моей локальной машине я получаю правильное количество пустых значений массива при использовании 1-й или 2-й опции (используяvar_dump()
). На сервере 2-й вариант возвращает только пустой массив, если нет значений ни на одномtable3_note
(Здесь очень многоtable3_id
s и другие поля, не показанные в запросе).
So the question is why? Обе функции претендуют на возвратNULL
если в руководстве отсутствуют ненулевые значения.
Является ли следующая информация релевантной или я что-то упустил из руководства?
Local machine: MySQL Client API version 5.1.44 Server: MySQL Client API version 5.0.51aЯвляется ли ответ настолько простым, что сервер обрабатываетCOALESCE
функционировать как моя локальная машина, ноGROUP_CONCAT
функция обрабатывается по-разному из-за несовпадающих версий MySQL Client API?
Теперь у меня есть рабочее решение, так что это не настоящий вопрос в том смысле, что мне нужно это исправить. Я просто хотел бы знать, почему это так. И есть ли подводные камни в использованииCOALESCE
как я использую? Существует ли опасность того, что массивы не синхронизируются должным образом при печатиfor
цикл? (По крайней мере, быстрое тестирование не выявило проблем.)
Финальные заметки. Я пытался использовать эти и некоторые другие методы (IFNULL
, IS NULL
и т. д.) как предложено, например, в следующих вопросах:
Но результат был тот же: работает на локальной машине, а не на сервере. Запросы ниже:
//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`
MySQL руководство также говорит:
Unless otherwise stated, group functions ignore NULL values.
Это значитCOALESCE
не игнорируетNULL
такие значения, какGROUP_CONCAT
делает, даже если проверено? Это по-прежнему не объясняет различного поведения сервера и локального компьютера. Или это?