JSON VIEW с использованием вопроса GROUP_CONCAT

0

Эй, администраторы баз данных и общие умные парни. У меня есть вопрос для вас.

Мы используем 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, поэтому я могу декодировать его на стороне сервера или на стороне клиента за один шаг.

  • 0
    Вы пытались запустить этот запрос непосредственно в базу данных. Вы получаете какие-либо предупреждения в выводе о group_concat? group_concat может легко достичь своего естественного ограничения в 1024 символа. (Который можно увеличить)
  • 0
    Я уже set global group_concat_max_len = 8192; (этого достаточно), но даже когда это происходит, он просто обрезает текст (я получаю только NULL ). но, думаю, это было проблемой раньше (испортил мой JSON)
Показать ещё 1 комментарий
Теги:
group-by

1 ответ

0

Я тестировал часть этого и не могу найти никакой ошибки.

Попробуйте создать 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
  • 0
    да, сработал бы VIEW, а затем получил бы эти данные, но я бы хотел сделать все это встроенным (у нас уже слишком много VIEWS валяется).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню