SQL CONCAT в JSON

Я пытаюсь достичь следующего результата 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');

Какой результат вы получаете? Вам будет легче помочь, если вы покажете результат, который получаете.

horatius 07.08.2018 14:54

пожалуйста, отметьте движок db, который вы используете, это не то же самое, что и способ объединения строк для каждой технологии

Jaime Drq 07.08.2018 14:54

Возможный дубликат Как получить данные JSON из mysql?

Muhammad Saqlain 07.08.2018 14:55

Просто обновите недостающую информацию

lStoilov 07.08.2018 14:58

@Muhammad Saqlain, дубликат, который вы упомянули, не такой, как мой

lStoilov 07.08.2018 15:00

Опубликуйте схему своей таблицы и образцы данных.

kkkkkkk 07.08.2018 17:06

Вот ссылка на схему конца данных. Выложу также в основном посте paiza.io/projects/w8d9ndxZD95ct-ph4N69tA?language=mysql

lStoilov 07.08.2018 17:17

Выполнять всю эту конкатенацию на стороне MySQL - не лучшая идея, лучше извлекать данные и объединять все, что вам нужно, на стороне приложения. Пока у вас проблема в том, что GROUP_CONCAT можно использовать только с данными GROUP BY. Но вы этого не сделаете.

Alex 07.08.2018 17:54

Обновите ожидаемый результат, чтобы он соответствовал опубликованным вами образцам данных. Это поможет нам понять вашу конечную цель. Я подозреваю, что вы хотите получить ответ mysql как json - что невозможно. Ответ Mysql всегда представляет собой простой текст, а некоторые столбцы могут быть любыми строками json.

Alex 07.08.2018 17:56

В ожидаемом результате обновлять нечего. Это так просто. В основном существует взаимодействие с 3 полями в базе данных (имя, изображение и информация), остальные в JSON жестко запрограммированы (на данный момент).

lStoilov 07.08.2018 18:16

Я не против, чтобы это был обычный текст ... после этого будет произведена дальнейшая обработка результата.

lStoilov 07.08.2018 18:17

Вы все еще не понимаете - невозможно то, что вы ожидаете получить.

Alex 07.08.2018 18:44
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
12
1 206
1

Ответы 1

Я все еще не уверен в твоей конечной цели.

Как я уже упоминал в комментариях, вам лучше выполнять все это преобразование 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.

Теперь я понимаю вашу точку зрения. Думаю, мне стоит попробовать сделать тебе результат. Спасибо за вашу помощь.

lStoilov 07.08.2018 21:22

Другие вопросы по теме