首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从多到多关系的3个表中使用MySQL连接数组

如何从多到多关系的3个表中使用MySQL连接数组
EN

Stack Overflow用户
提问于 2018-03-14 14:12:01
回答 1查看 1.2K关注 0票数 1

我在本地服务器中使用phpMyAdmin创建了一个phpMyAdmin数据库。在这个数据库中,我存储了我的friends.This的名字和最喜欢的NBA球队,这显然是一种多到多的关系。出于这个原因,我在MySQL中运行了下面的脚本来为这个数据库创建适当的表:

代码语言:javascript
复制
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,
)

显然,我在这些表中插入了一些值,但为了节省一些空间,我并没有在这里提供大量的源代码。其中一小部分如下:

代码语言:javascript
复制
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输出:

代码语言:javascript
复制
{
    "id": "1",
    "name": "Alex James",
    "team": ["Boston Celtics", "Cleveland Cavaliers"] 
}

我怎样才能为MySQL的每个人打造一组最喜欢的团队呢?

我认为在用PHP检索数据之前,最好在MySQL中这样做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-14 14:41:49

"eazy“方法是使用CONCAT生成JSON。

并使用GROUP_CONCAT将多个团队记录组合到一个JSON数组中。

此方法也适用于不支持创建JSON函数的旧MySQL版本。

查询

代码语言:javascript
复制
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

结果

代码语言:javascript
复制
|                                                            json |
|-----------------------------------------------------------------|
| {"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]} |

演示

http://www.sqlfiddle.com/#!9/4cd244/19

编辑了更多的朋友

查询

代码语言:javascript
复制
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

结果

代码语言:javascript
复制
|                                                                                                                                             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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49279952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档