Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / группировка результатов с конкатенацией внутри группы / 6 сообщений из 6, страница 1 из 1
13.09.2013, 12:18:19
    #38395838
ugodrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка результатов с конкатенацией внутри группы
есть некая таблица
id key val
с данными
1 1 1
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
3 1 1
3 2 1
3 3 1
...
нужно вернуть при выборке нечто вроде JSON
чтобы результат был примерно таким:
id val
1 '1:1,2:[1,2]'
2 '1:[1,2],2:1'
3 '1:1,2:1,3:1'
впринципе с простой конкатенацией для id = 3 я сделал запросец... но вот как сделать проверку на множественные значения для 1,2 ?
...
Рейтинг: 0 / 0
13.09.2013, 12:40:45
    #38395877
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка результатов с конкатенацией внутри группы
(group by id,key)group by id ?
...
Рейтинг: 0 / 0
13.09.2013, 13:07:14
    #38395937
ugodrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка результатов с конкатенацией внутри группы
SELECT id, cast(CONCAT("{",GROUP_CONCAT(CONCAT(key,":", val) separator ","),"}") as char) val
FROM arraytest
group by id

даёт
'1', '{1:1,2:1,2:2}'
'2', '{1:1,1:2,2:1}'
'3', '{1:1,2:1}'

таким образом id=3 - без нареканий там каждому ключу соответствует одно значение
запрос взял от другой таблицы.. там как раз нет такого соотношения ключей и значений
а вот для id in(1,2) нужно сгруппировать значения т.к. там одному ключу соответствует несколько значений

'1', '{1:1,2:[1,2]}'
'2', '{1:[1,2],2:1}'
...
Рейтинг: 0 / 0
13.09.2013, 13:21:16
    #38395961
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка результатов с конкатенацией внутри группы
Вложенный подзапрос. В нём и во внешнем свои группировка и конкатенация.
...
Рейтинг: 0 / 0
13.09.2013, 13:25:36
    #38395972
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка результатов с конкатенацией внутри группы
И будет намного проще, если любая группа будет браться в скобки - даже из 1 элемента.
...
Рейтинг: 0 / 0
13.09.2013, 14:36:44
    #38396112
ugodrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка результатов с конкатенацией внутри группы
Akina, спасибо..

сделал так

SELECT ta.id,CAST(CONCAT('{',GROUP_CONCAT(CONCAT(ta.key,':',ta.val) SEPARATOR ','),'}') as char)
FROM (
SELECT tb.id id, tb.key key, IF(ia.arr = 0, val , concat('[',GROUP_CONCAT(tb.val SEPARATOR ','),']')) val
FROM arraytest tb
LEFT JOIN keyarr ia
ON tb.key = ia.id
GROUP BY tb.id, tb.key
) ta
group by ta.id

просто подцепил таблицу со свойствами ключа.. одно из которых: может ли он содержать несколько значений.
соответственно если может, то конкатенация в группе заключается в [], а если нет, то возвращается одно значение

исходные данные arraytest

'1', '1', '1'
'1', '2', '1'
'1', '2', '2'
'2', '1', '1'
'2', '2', '1'
'2', '2', '2'
'3', '1', '1'
'3', '2', '1'

исходные данные keyarr (id ключа и arr - может иметь множество значений)

'1', '0'
'2', '1'

Результат запроса..

'1', '{1:1,2:[1,2]}'
'2', '{1:1,2:[1,2]}'
'3', '{1:1,2:[1]}'
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / группировка результатов с конкатенацией внутри группы / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]