Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从3个多对多关系表中使用MySQL连接阵列_Php_Mysql_Json - Fatal编程技术网

Php 如何从3个多对多关系表中使用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` ( `

我在本地服务器上用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` (
  `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循环吗?