我正在尝试实现以下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`


结果:


  无效使用组功能


我不确定这是否是实现我要完成的工作的最佳方法,因此也欢迎其他任何想法。

我在MyISAM引擎上使用MySQL。

更新

我注意到,当我不嵌套并且仅创建简单对象时,它可以正常工作,并且可以正确执行。

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数组!
我的意思是,您可以使用concat将此选择作为子查询来播放和包装此选择。但是整个方法的体系结构非常错误,您应该避免在sql端进行如此大的转换。

10-05 20:27
查看更多