Эй, администраторы баз данных и общие умные парни. У меня есть вопрос для вас.
Мы используем MySQL VIEWs для форматирования наших данных как JSON при его возврате (как BLOB), что удобно (хотя и не особенно приятно по производительности, но мы уже это знаем).
Но я не могу заставить конкретный запрос работать прямо сейчас (каждая строка содержит NULL, когда она должна содержать созданный объект JSON со значениями нескольких JOIN).
Здесь общая идея:
SELECT CONCAT(
"{",
"\"some_list\":[", GROUP_CONCAT( DISTINCT t1.id ), "],",
"\"other_list\":[", GROUP_CONCAT( DISTINCT t2.id ), "],",
"}"
) cool_json
FROM table_name tn
INNER JOIN ( some_table st ) ON st.some_id = tn.id
LEFT JOIN ( another_table at, another_one ao, used_multiple_times t1 )
ON st.id = at.some_id AND
at.different_id = ao.different_id AND
ao.different_id = t1.id
LEFT JOIN ( another_table2 at2, another_one2 ao2, used_multiple_times t2 )
ON st.id = at2.some_id AND
at2.different_id = ao2.different_id AND
ao2.different_id = t2.id
GROUP BY tn.id ORDER BY tn.name
Кто-нибудь знает проблему здесь? Я что-то упускаю, чтобы сгруппировать? Он работал, когда я делал только 1 LEFT JOIN и GROUP_CONCAT, но теперь с несколькими JOINs/GROUP_CONCAT, которые он испортил.
Когда я перемещаю GROUP_CONCAT из поля "cool_json", они работают так, как ожидалось, но я хотел бы, чтобы мои данные были отформатированы как JSON, поэтому я могу декодировать его на стороне сервера или на стороне клиента за один шаг.
Я тестировал часть этого и не могу найти никакой ошибки.
Попробуйте создать VIEW, например
CREATE VIEW tn_view AS
SELECT tn.id, tn.name, t1.id, t2.id
FROM table_name tn
INNER JOIN ( some_table st ) ON st.some_id = tn.id
LEFT JOIN ( another_table at, another_one ao, used_multiple_times t1 )
ON st.id = at.some_id AND
at.different_id = ao.different_id AND
ao.different_id = t1.id
LEFT JOIN ( another_table2 at2, another_one2 ao2, used_multiple_times t2 )
ON st.id = at2.some_id AND
at2.different_id = ao2.different_id AND
ao2.different_id = t2.id
THEN
SELECT CONCAT(
"{",
"\"some_list\":[", GROUP_CONCAT( DISTINCT t1.id ), "],",
"\"other_list\":[", GROUP_CONCAT( DISTINCT t2.id ), "],",
"}"
) cool_json
FROM tn_view
GROUP BY id ORDER BY name
set global group_concat_max_len = 8192;
(этого достаточно), но даже когда это происходит, он просто обрезает текст (я получаю толькоNULL
). но, думаю, это было проблемой раньше (испортил мой JSON)