Я пытаюсь достичь следующего результата 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'
Результат:
Недопустимое использование групповой функции
Я не уверен, что это лучший способ добиться того, что я пытаюсь сделать, поэтому любые другие идеи также приветствуются.
Я использую 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');
Я до сих пор не уверен в вашей конечной цели.
Как я уже упомянул в комментариях, вам лучше сделать все это 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! Это то, что я имею в виду, что вы можете играть и переносить этот выбор с помощью другого select с concat, который имеет этот подзапрос. Но весь этот подход имеет очень неправильную архитектуру, и вам следует избегать таких больших преобразований на стороне SQL.