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) восстанавливаетNULLs как пустые строки и вторые полосы всеNULL значения из набора результатов. (Это неприемлемо, потому что у меня много массивов, и они должны быть синхронизированы.)

Первоначальная проблема решена из-за моей ошибки. Я все еще хотел бы знать, почемуGROUP_CONCAT игнорируемыхNULLс, даже если проверено.

Вот's запрос, который работает правильно (нет раздетьNULLs):

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`

Так почему этот игнорируетNULLs? (Больше параметров запроса, которые игнорируют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_ids и другие поля, не показанные в запросе).

Итак, вопрос почему? Обе функции претендуют на возвратNULL если в руководстве отсутствуют ненулевые значения.

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

Является ли следующая информация релевантной или я что-то упустил из руководства?

Локальный компьютер: MySQL Client API версия 5.1.44Сервер: MySQL Client API версия 5.0.51a

Является ли ответ настолько простым, что сервер обрабатываетCOALESCE функционировать как моя локальная машина, ноGROUP_CONCAT функция обрабатывается по-разному из-за несовпадающих версий MySQL Client API?

Теперь у меня есть рабочее решение, так что это неЭто настоящий вопрос в том смысле, что мне нужно это исправить. Я'Я просто хотел бы знать, почему это так. И есть ли подводные камни в использованииCOALESCE Как я'я использую? Существует ли опасность того, что массивы не синхронизируются должным образом при печатиfor цикл? (По крайней мере, быстрое тестирование нене выявить никаких проблем.)

Финальные заметки. Я пытался использовать эти и некоторые другие методы (,IFNULLIS NULL и т. д.) как предложено, например, в следующих вопросах:

GROUP_CONCAT возвращает NULL, если любое значение равно NULLСтроки с нулевым значением для group_concat не возвращаются

Но результат был тот же: работает на локальной машине, а не на сервере. Запросы ниже:

//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 делает, даже если проверено? Это все еще необъяснить различные варианты поведения сервера и локальной машины. Или это?

Ответы на вопрос(1)

Ваш ответ на вопрос