JSON VIEW с использованием вопроса GROUP_CONCAT - PullRequest
0 голосов
/ 26 января 2010

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

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

Когда я перемещаю GROUP_CONCAT из поля "cool_json", они работают как положено, но я хотел бы, чтобы мои данные были отформатированы как JSON, чтобы я мог декодировать их на стороне сервера или на стороне клиента за один шаг.

1 Ответ

0 голосов
/ 26 января 2010

Я проверил кое-что из этого и не могу найти ни одной ошибки.

Попробуйте создать ВИД как

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

ТО

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
...