MySQL GROUP_CONCAT, которая на самом деле регистрирует NULL?

У меня есть этот большой процедурно сгенерированный запрос MySQL. В части этого запроса я должен объединить разделенные ячейки в одну ячейку. Это связано с тем, что у человека может быть более одной записи в форме (в случае тех же данных, которые мне были предоставлены, это автомобили, дома, велосипеды и коляски). Я могу использовать GROUP_CONCAT, чтобы сделать его одним полем, каждое из которых разделено, и это работает очень хорошо, но есть проблема.

У некоторых людей не заполнена вся информация, так что возьмем, к примеру, автомобили, их три, но у одного есть фотография, а это оказывается третье. Итак, я все результаты, но не в исходном порядке

что у меня в таблице

ID# | OWNERID# | make    | model     | year | picture
----+----------+---------+-----------+------+-------------
1   | 3        | corolla | gt-s      | 1986 |
2   | 3        | fit     | V6        | 2001 |
3   | 3        | starlet | GT        | 1981 | car.jpg
4   | 4        | F-150   | SuperDuty | 2010 |
5   | 5        | beetle  |           | 1968 |

когда я запускаю свой запрос GROUP_CONCAT, я получаю это

ID# | OWNERID# | make                | model      | year           | picture
----+----------+---------------------+------------+----------------+-------------
1   | 3,3,3    | corolla,fit,starlet | gt-s,V6,GT | 1986,2001,1981 | car.jpg
4   | 4        | F-150               | SuperDuty  | 2010           |
5   | 5        | beetle              |            | 1968           |

но я хочу получить это

ID# | OWNERID# | make                | model      | year           | picture
----+----------+---------------------+------------+----------------+-------------
1   | 3,3,3    | corolla,fit,starlet | gt-s,V6,GT | 1986,2001,1981 | ,,car.jpg
4   | 4        | F-150               | SuperDuty  | 2010           |
5   | 5        | beetle              |            | 1968           |

обратите внимание на две запятые в "carimage.jpg"

Проблема, похоже, сосредоточена вокруг самой первой части запроса SELECT GROUP_CONCAT(cfv.value) FROM cf_customfield_values cfv. Я пробовал несколько вещей, чтобы заставить его вести себя так, как мне нужно.

Использование IFNULL внутри GROUP_CONCAT для изменения нулевых значений на что-то другое
Немного переместив IFNULL, чтобы посмотреть, смогу ли я получить лучший результат
Использование традиционного оператора IF для изменения нулей на что-то другое
Использование COALESCE, чтобы убедиться, что всегда был хотя бы 1 не-NULL
Связывание строки с началом и / или концом значения, чтобы оно всегда имело жало и, следовательно, не было NULL
Я даже пробовал сделав его GROUP_CONCAT ('test'), что дало понять, что на самом деле не имеет значения, что там находится, он все равно поймет, что это NULL, и не будет его объединять.

Причина, по которой я действительно хочу это сделать, заключалась в том, чтобы затем я мог разбить объединенные значения на подтаблицы для отображения (очевидно, я бы использовал что-то большее, чем запятую, чтобы предотвратить любые возможные ошибки в части сценариев отображения).

Вау, это было дольше, чем я думал, TLDR; мне нужен GROUP_CONCAT, чтобы объединять нули так же, как значения.


Каким должен быть результат? По чему вы группируетесь? У вас их 2, когда я запускаю свой запрос GROUP_CONCAT, я получаю this в вашем вопросе с двумя разными результатами.

ПОЛНЫЙ SQL


person Phillip Gooch    schedule 15.02.2011    source источник
comment
ой, я исправил, получаю первые результаты, хочу второй   -  person The Scrum Meister    schedule 15.02.2011
comment
выглядит примерно так: stackoverflow.com/questions/26680893/   -  person Phillip Gooch    schedule 15.02.2011
comment
нет, я уже пробовал использовать COALESCE, не работает, по-прежнему игнорирует первые два поля NULL   -  person Preuk    schedule 04.05.2016


Ответы (1)


person    schedule
comment
вы используете внутреннее соединение? лучше всего разместить свой ПОЛНЫЙ SQL - person Phillip Gooch; 15.02.2011
comment
Я использую LEFT JOIN, я попробую опубликовать свой полный SQL, но он огромен, как только он сгенерирован скриптом, и довольно беспорядочный. - person ajreal; 15.02.2011
comment
_2_ proffv LEFT JOIN _3_ proff ON proffv.fieldid = proff.id LEFT JOIN cf_profiles prof ON prof.id = proffv.profileid WHERE proff.id = '1') AS 'profile_first_name', (SELECT GROUP_CONCAT (DISTINCT '[subtable] , CONCAT ('[row num = "', proffv.profileid, '"]', proffv.value), '[/ subtablerow]') FROM _4_ proffv LEFT JOIN _5_ proff ON proffv.fieldid = proff.id LEFT JOIN cf_profiles prof ON prof.id = proffv.profileid WHERE proff.id = '2') AS 'profile_last_name', (SELECT GROUP_CONCAT (DISTINCT '[subtablerow]', CONCAT ('[row num = "', proffv.profileid, '" ] ', proffv.value),' [/ subtablerow] ') FROM _6_ proffv LEFT JOIN _7_ proff ON proffv.fieldid = proff.id LEFT JOIN cf_profiles prof ON prof.id = proffv.profileid WHERE proff.id =' 3 ' ) AS 'profile_e-mail_address', (SELECT GROUP_CONCAT (DISTINCT '[subtablerow]', CONCAT ('[row num = "', proffv.profileid, '"]', proffv.value), '[/ subtablerow]') FROM _8_ proffv LEFT JOIN _9_ proff ON proffv.fieldid = proff.id LEFT JOIN cf_profiles prof ON prof.id = proffv.profileid ГДЕ proff.id = '4') AS 'profile_ phone _-_ office ', (SELECT GROUP_CONCAT (DISTINCT' [subtablerow] ', CONCAT (' [row num = "', proffv.profileid,'"] ', proffv.value),' [/ subtablerow] ') FROM _10_ proffv LEFT JOIN _11_ proff ON proffv.fieldid = proff.id LEFT JOIN cf_profiles prof ON prof.id = proffv.profileid WHERE proff.id = '6') AS 'profile_fax', (SELECT GROUP_CONCAT (DISTINCT '[subtablerow]', CONCAT ('[row num = "', proffv.profileid, '"]', proffv.value), '[/ subtablerow]') FROM _12_ proffv LEFT JOIN _13_ proff ON proffv.fieldid = proff.id LEFT JOIN cf_profiles prof ON prof.id = proffv.profileid ГДЕ proff.id = '7') AS 'profile_password', (SELECT GROUP_CONCAT (DISTINCT '[subtablerow]', CONCAT ('[row num = "', proffv.profileid, '"]' , proffv.value), '[/ subtablerow]') ОТ _14_ proffv ЛЕВОЕ СОЕДИНЕНИЕ _15_ proff ON proffv.fieldid = proff.id ЛЕВОЕ СОЕДИНЕНИЕ cf_profiles prof ON prof.id = proffv.profileid ГДЕ proff.id = '9') КАК 'profile_phone _-_ cell', (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 9 AND cfv.memberid = core.id) КАК велосипед s_build_material, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 10 AND cfv.memberid = core.id) AS bicycles_color, (SELECT GROUP_CONCAT (IFNULL (cfv ') value,' test ) FROM cf_customfield_values ​​cfv WHERE fieldid = 7 AND cfv.memberid = core.id) AS bicycles_frame_size, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldidmember = 8 AND cfv. ) AS bicycles_wheel_size, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 4 AND cfv.memberid = core.id) AS cars_exterior_color, (SELECT GROUP_CONCAT (IFNULL, cf ')) ОТ cf_customfield_values ​​cfv WHERE fieldid = 5 AND cfv.memberid = core.id) AS cars_interior_color, (SELECT GROUP_CONCAT (IFNULL (cfv.value,' test ')) FROM cf_customfield_values ​​cfv WHERE fieldidmember = 18 AND cfv. .id) КАК cars_interior_color, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 17 AND cfv.memb erid = core.id) AS cars_license, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 1 AND cfv.memberid = core.id) AS cars_make, (SELECT GROUP_CONCAT (IFNULL (cfv .value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 2 AND cfv.memberid = core.id) AS cars_model, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 14 AND cfv.memberid = core.id) AS cars_picture, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 6 AND cfv.memberid = core.id) AS cars_upholstery_material, (SELECT GROUP_NCAT (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 15 AND cfv.memberid = core.id) AS cars_vehicle_history, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​field cf_customfield_values ​​field cf_customfield_values ​​field cf_customfield_values ​​field cf 16 И cfv.memberid = core.id) AS cars_vin, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 3 AND cfv.memberid = core.id) AS cars_year, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 21 AND cfv.memberid = core.id) AS contact_info_email_address, (SELECT GROUP_CONCAT (IFNULL, cfv. )) FROM cf_customfield_values ​​cfv WHERE fieldid = 20 AND cfv.memberid = core.id) AS contact_info_fax, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldidmember = 19 AND cfv. id) AS contact_info_phone, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fieldid = 22 AND cfv.memberid = core.id) AS contact_info_url, (SELECT GROUP_CONCAT (IFNULL, cfv. test ')) FROM cf_customfield_values ​​cfv WHERE fieldid = 13 AND cfv.memberid = core.id) AS strollers_height, (SELECT GROUP_CONCAT (IFNULL (cfv.value,' test ')) FROM cf_customfield_values ​​cfv WHERE fieldmember = 11 AND cfv. core.id) AS strollers_seats, (SELECT GROUP_CONCAT (IFNULL (cfv.value, 'test')) FROM cf_customfield_values ​​cfv WHERE fiel - person Phillip Gooch; 15.02.2011