SQL CONCAT to JSON

0

Я пытаюсь достичь следующего результата 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');
  • 0
    Какой результат вы получаете? Вам будет легче помочь, если вы покажете результат, который вы получаете.
  • 0
    пожалуйста, назовите движок БД, который вы используете, это не то же самое, что объединять строки для каждой технологии
Показать ещё 10 комментариев
Теги:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню