Я пытаюсь достичь следующего результата JSON (цикл по строкам в базе данных):
[{
"title":"Pasta E Vino Petraglia",
"image_url":"image",
"subtitle":"description 1",
"buttons":[
{
"type": "url",
"caption": "More Details",
"url": "https://domain"
}
]
},{
"title":"La Pasta",
"image_url":"image",
"subtitle":"description 2",
"buttons":[
{
"type": "url",
"caption": "More Details",
"url": "https://domain"
}
]
}]
И я хочу сделать это прямо в SQL-запросе. Я написал эту строку, но что-то не так, и я не могу понять, что не так и что мне делать.
SELECT CONCAT('[{',GROUP_CONCAT(concat_ws(',',concat('"title":"',name,'"'),concat('"image_url":"',image,'"'),concat('"subtitle":"',info,'"'),CONCAT('"buttons":[{',GROUP_CONCAT(concat_ws(',',concat('"type":"url"'),concat('"caption":"More Details"'),concat('"url":"https://domain"')) SEPARATOR '},{'),'}]')
) SEPARATOR '},{'),'}]') FROM `Places`
Результат:
Invalid use of group function
Я не уверен, что это лучший способ достичь того, что я пытаюсь сделать, поэтому любые другие идеи также приветствуются.
Я использую MySQL с движком MyISAM.
ОБНОВИТЬ
Я заметил, что когда я не использую вложенный объект и не создаю только простой объект, он работает нормально, и это выполняется правильно.
SELECT CONCAT('[{',GROUP_CONCAT(concat_ws(',',concat('"title":"',name,'"'),concat('"image_url":"',image,'"'),concat('"subtitle":"',info,'"')
) SEPARATOR '},{'),'}]')
Итак, на самом деле вторая группа concat_group - это то, где проблема, или место, где я объединяю, этот фрагмент кода
CONCAT('"buttons":[{',GROUP_CONCAT(concat_ws(',',concat('"type":"url"'),concat('"caption":"More Details"'),concat('"url":"https://domain"')) SEPARATOR '},{'),'}]')
Схема базы данных
CREATE TABLE `Places` (
`id` int(11) DEFAULT NULL,
`name` varchar(22) DEFAULT NULL,
`info` varchar(197) DEFAULT NULL,
`type` varchar(10) DEFAULT NULL,
`subtype` varchar(15) DEFAULT NULL,
`keywords` varchar(36) DEFAULT NULL,
`image` varchar(140) DEFAULT NULL,
`url` varchar(110) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Пример данных
INSERT INTO `Places` (`id`, `name`, `info`, `type`, `subtype`, `keywords`, `image`, `url`) VALUES
(1, 'Pasta E Vino Petraglia', 'description 1', 'Restaurant', 'Italian', 'pasta ', 'https://lostinplovdiv.com/timthumb.php?src=/media/images/aefb966533cc0bffe40b9d1e14ca0c4c7018de3891db83ccf721cf761df9359e.png&w=460&h=&zc=0', 'https://www.facebook.com/Pasta-E-Vino-Petraglia-194285454717186/'),
(2, 'La Pasta', 'description 2', 'Restaurant', 'Italian', 'pasta', 'https://lostinplovdiv.com/timthumb.php?src=/media/images/291359f1fa156815c2c9632033e23b8c9598885783faca803096e6bebc4c46c6.png&w=460&h=&zc=0', 'https://www.tripadvisor.com/Restaurant_Review-g295391-d11889447-Reviews-La_pasta-Plovdiv_Plovdiv_Province.html'),
(3, 'Brick House', 'BRICK HOUSE description 3', 'Restaurant', 'Burger', 'burger', 'https://lostinplovdiv.com/timthumb.php?src=/media/images/c732a45b8f3b2aec8dfb976f8c3609af7c29d16799ffc73998f09657ad9bb314.png&w=460&h=&zc=0', 'https://bg-bg.facebook.com/brickkhousee/posts');
пожалуйста, отметьте движок db, который вы используете, это не то же самое, что и способ объединения строк для каждой технологии
Возможный дубликат Как получить данные JSON из mysql?
Просто обновите недостающую информацию
@Muhammad Saqlain, дубликат, который вы упомянули, не такой, как мой
Опубликуйте схему своей таблицы и образцы данных.
Вот ссылка на схему конца данных. Выложу также в основном посте paiza.io/projects/w8d9ndxZD95ct-ph4N69tA?language=mysql
Выполнять всю эту конкатенацию на стороне MySQL - не лучшая идея, лучше извлекать данные и объединять все, что вам нужно, на стороне приложения. Пока у вас проблема в том, что GROUP_CONCAT можно использовать только с данными GROUP BY. Но вы этого не сделаете.
Обновите ожидаемый результат, чтобы он соответствовал опубликованным вами образцам данных. Это поможет нам понять вашу конечную цель. Я подозреваю, что вы хотите получить ответ mysql как json - что невозможно. Ответ Mysql всегда представляет собой простой текст, а некоторые столбцы могут быть любыми строками json.
В ожидаемом результате обновлять нечего. Это так просто. В основном существует взаимодействие с 3 полями в базе данных (имя, изображение и информация), остальные в JSON жестко запрограммированы (на данный момент).
Я не против, чтобы это был обычный текст ... после этого будет произведена дальнейшая обработка результата.
Вы все еще не понимаете - невозможно то, что вы ожидаете получить.






Я все еще не уверен в твоей конечной цели.
Как я уже упоминал в комментариях, вам лучше выполнять все это преобразование json на стороне приложения.
Пока мне кажется, что GROUP_CONCAT вам вообще не нужен.
Вот самый близкий подход, который вы можете получить ИМХО:
http://sqlfiddle.com/#!9/125235/12
SELECT CONCAT('{\"title\":\"',name,'\", \"image_url\":\"',image,'\", \"subtitle\":\"',info,
'\"buttons\":[{\"type\": \"url\",\"caption\": \"More Details\",\"url\": \"https://domain"}]\"}')
FROM Places;
SELECT GROUP_CONCAT('[',CONCAT('{\"title\":\"',name,'\", \"image_url\":\"',image,'\", \"subtitle\":\"',info,
'\"buttons\":[{\"type\": \"url\",\"caption\": \"More Details\",\"url\": \"https://domain"}]\"}'),
']')
FROM Places
Но, пожалуйста, проверьте - последний запрос - не возвращает правильный обернутый массив json! Это то, что я имел в виду, вы можете поиграть и обернуть этот выбор другим выбором с concat, используя этот как подзапрос. Но в целом этот подход имеет очень неправильную архитектуру, и вам следует избегать таких больших преобразований на стороне sql.
Теперь я понимаю вашу точку зрения. Думаю, мне стоит попробовать сделать тебе результат. Спасибо за вашу помощь.
Какой результат вы получаете? Вам будет легче помочь, если вы покажете результат, который получаете.