2010-01-26 1 views
0

Эй, администраторы баз данных и общие умные парни. У меня к тебе вопрос.JSON VIEW using GROUP_CONCAT вопрос

Мы используем 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_CONCATs он испортил это.

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

+0

Вы пробовали выполнения этого запроса непосредственно в базу данных. Получаете ли вы какие-либо предупреждения в отчете о group_concat? group_concat может легко достигнуть своего естественного предела в 1024 символа. (Который может быть увеличен) – MindStalker

+0

Я уже установил global group_concat_max_len = 8192; '(этого достаточно), но даже когда это происходит, он просто отключает текст (я получаю только« NULL'). (предположим, что это было раньше (испортить мой JSON) –

+0

Возможный дубликат [Как создать json-формат с групповым concat mysql?] (http://stackoverflow.com/questions/12511933/how-create- json-format-with-group-concat-mysql) – e4c5

ответ

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, а затем захватит эти данные, но я хотел бы сделать все это inline (у нас уже слишком много VIEWS). –