我在本地服务器中使用phpMyAdmin创建了一个phpMyAdmin数据库。在这个数据库中,我存储了我的friends.This的名字和最喜欢的NBA球队,这显然是一种多到多的关系。出于这个原因,我在MySQL中运行了下面的脚本来为这个数据库创建适当的表:
CREATE TABLE `friends` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `teams` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `relations` (
`friends_id` int(4) NOT NULL,
`teams_id` int(4) NOT NULL,
)显然,我在这些表中插入了一些值,但为了节省一些空间,我并没有在这里提供大量的源代码。其中一小部分如下:
INSERT INTO `friends` (`id`, `name`)
VALUES
(1,'David Belton'),
(2,'Alex James');
INSERT INTO `teams` (`id`, `name`)
VALUES
(1,'Cleveland Cavaliers'),
(2,'Boston Celtics');
INSERT INTO `relations` (`friends_id`, `teams_id`)
VALUES
(1,1),
(2,1),
(2,2);在运行了从数据库获取数据并打印数据的PHP脚本之后,我希望为我的每个朋友提供以下类型的有效的json输出:
{
"id": "1",
"name": "Alex James",
"team": ["Boston Celtics", "Cleveland Cavaliers"]
}我怎样才能为MySQL的每个人打造一组最喜欢的团队呢?
我认为在用PHP检索数据之前,最好在MySQL中这样做。
发布于 2018-03-14 14:41:49
"eazy“方法是使用CONCAT生成JSON。
并使用GROUP_CONCAT将多个团队记录组合到一个JSON数组中。
此方法也适用于不支持创建JSON函数的旧MySQL版本。
查询
SET SESSION group_concat_max_len = @@max_allowed_packet
SELECT
CONCAT(
"{"
, '"id"' , ":" , '"' , friends.id , '"' , ","
, '"name"' , ":" , '"' , friends.name , '"' , ","
, '"team"' , ":" , "["
, GROUP_CONCAT('"', teams.name, '"')
, "]"
, "}"
) AS json
FROM
friends
INNER JOIN
relations
ON
friends.id = relations.friends_id
INNER JOIN
teams
ON
relations.teams_id = teams.id
WHERE
friends.id = 1结果
| json |
|-----------------------------------------------------------------|
| {"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]} |演示
http://www.sqlfiddle.com/#!9/4cd244/19
编辑了更多的朋友
查询
SET SESSION group_concat_max_len = @@max_allowed_packet
SELECT
CONCAT(
"["
, GROUP_CONCAT(json_records.json) # combine json records into a string
, "]"
) AS json
FROM (
SELECT
CONCAT(
"{"
, '"id"' , ":" , '"' , friends.id , '"' , ","
, '"name"' , ":" , '"' , friends.name , '"' , ","
, '"team"' , ":" , "["
, GROUP_CONCAT('"', teams.name, '"')
, "]"
, "}"
) AS json
FROM
friends
INNER JOIN
relations
ON
friends.id = relations.friends_id
INNER JOIN
teams
ON
relations.teams_id = teams.id
WHERE
friends.id IN(SELECT id FROM friends) #select the friends you need or just simply friends.id IN(1, 2)
GROUP BY
friends.id
)
AS json_records结果
| json |
|--------------------------------------------------------------------------------------------------------------------------------------------------|
| [{"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]},{"id":"2","name":"Alex James","team":["Boston Celtics","Cleveland Cavaliers"]}] |演示
http://www.sqlfiddle.com/#!9/4cd244/61
https://stackoverflow.com/questions/49279952
复制相似问题