【问题标题】:SQL CONCAT to JSONSQL CONCAT 转 JSON
【发布时间】:2019-01-14 13:48:09
【问题描述】:

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

【问题讨论】:

  • 你得到了什么结果?如果你展示你得到的结果,帮助会更容易。
  • 请标注您正在使用的数据库引擎,每种技术连接字符串的方式不一样
  • 更新缺失的信息
  • @Muhammad Saqlain,你提到的副本和我的不一样

标签: mysql sql json


【解决方案1】:

我仍然不确定你的最终目标。

正如我在 cmets 中已经提到的,您最好在应用程序端进行所有这些 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端进行如此大的转换。

【讨论】:

  • 我现在明白你的意思了。我想我应该试着用结果来做你。谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-02-10
  • 2020-12-28
  • 1970-01-01
  • 2014-10-24
  • 2017-08-29
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多