Php 如何从3个多对多关系表中使用MySQL连接阵列
我在本地服务器上用phpMyAdmin创建了一个mySQL数据库。在这个数据库中,我存储了我朋友的名字和最喜欢的NBA球队。这显然是一种多对多的关系。因此,我在MySQL中运行以下脚本为该数据库创建适当的表:Php 如何从3个多对多关系表中使用MySQL连接阵列,php,mysql,json,Php,Mysql,Json,我在本地服务器上用phpMyAdmin创建了一个mySQL数据库。在这个数据库中,我存储了我朋友的名字和最喜欢的NBA球队。这显然是一种多对多的关系。因此,我在MySQL中运行以下脚本为该数据库创建适当的表: CREATE TABLE `friends` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) CREATE TABLE `teams` ( `
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中执行此操作。使用CONCAT生成JSON是“eazy”方法并使用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
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"]} |
| json |
|--------------------------------------------------------------------------------------------------------------------------------------------------|
| [{"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]},{"id":"2","name":"Alex James","team":["Boston Celtics","Cleveland Cavaliers"]}] |
演示
编辑了更多朋友
查询
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
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"]} |
| json |
|--------------------------------------------------------------------------------------------------------------------------------------------------|
| [{"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]},{"id":"2","name":"Alex James","team":["Boston Celtics","Cleveland Cavaliers"]}] |
演示
您能为您的表格提供一些示例数据吗|因为您的JSON示例只给出一行!多用户JSON响应应该是什么样子?“另一方面,我假设在使用PHP检索数据之前,最好在MySQL中执行此操作。”不,在PHP中,生成JSON数据要容易得多。您使用的是哪个版本的MySQL?很抱歉@RaymondNijland的延迟。我编辑了这篇文章。我想你是在找这样的东西:不@Sander这是标记为MySQL而不是SQL Server的非常好的一个。但是,您没有向我显示“Alex James”的结果,他有两支最受欢迎的球队,这就是我问这个问题的原因。Alex是朋友。id=2您需要更改WHERE语句。。检查sqlfiddle演示,还有alex示例。。您的示例JSON只使用了一条记录,因此我的答案基于此。。此外,您的JSON示例混淆了David Belton和Alex James的数据。很抱歉,这部分是我在帖子中犯的错误。回答得很好,很抱歉延迟勾选。但是,您是否愿意编辑您的帖子(或写一篇真正的分析性评论),向我解释如何为许多
朋友
这样做?我应该使用一个计数器变量和一个while循环吗?