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
с, даже если проверено.
Вот's запрос, который работает правильно (нет раздеть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`
Оригинальный вопрос (не важно, мой плохой ...)Часть моего запроса, которая использует три таблицы (отношение 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 и другие поля, не показанные в запросе).
Итак, вопрос почему? Обе функции претендуют на возвратNULL
если в руководстве отсутствуют ненулевые значения.
Является ли следующая информация релевантной или я что-то упустил из руководства?
Локальный компьютер: MySQL Client API версия 5.1.44Сервер: MySQL Client API версия 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 также говорит:
Если не указано иное, групповые функции игнорируют значения NULL.
Это значитCOALESCE
Безразлично»т игнорироватьNULL
такие значения, какGROUP_CONCAT
делает, даже если проверено? Это все еще необъяснить различные варианты поведения сервера и локальной машины. Или это?