是否有查询将多对多链接表连接到单个记录中?

Tom*_*n32 2 mysql sql

我在两个表之间有一个标准的多对多关系,使用第三个链接表进行链接.无论如何将链接的id连接到一个带有查询的记录中?

我意识到我可以处理一个典型的连接并用它构建一个新的列表,只是想知道它是否可以用查询完成.例:

EventID | EventName | EventTypeIDs

1 | Party | 1,2,3

Events
+-------------+-------------+
| Field       | Type        |
+-------------+-------------+
| EventID     | INT         |
| EventName   | varchar(45) |
+-------------+-------------+

EventTypes
+-------------+-------------+
| Field       | Type        |
+-------------+-------------+
| id          | INT         |
| value       | varchar(25) |
+-------------+-------------+

EventTypeLink
+-------------+-------------+
| Field       | Type        |
+-------------+-------------+
| id          | INT         |
| EventID     | INT         |
| EventTypeID | INT         |
+-------------+-------------+
Run Code Online (Sandbox Code Playgroud)

Mah*_*mal 6

就在这里.使用GROUP_CONCAT() 如下:

SELECT
  e.EventId,
  e.EventName,
  GROUP_CONCAT(t.Id SEPARATOR ',') AS EventTypeIDs
FROM Events e
INNER JOIN EventTypeLink l ON e.EventId = l.EventId
INNER JOIN EventTypes    t ON l.EventTypeId = t.Id
GROUP BY   e.EventId,  
           e.EventName;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴演示

这会给你:

| EVENTID | EVENTNAME | EVENTTYPEIDS |
--------------------------------------
|       1 |     Party |        1,2,3 |
Run Code Online (Sandbox Code Playgroud)

请注意:如果您需要包含那些没有类型的事件,请使用LEFT JOIN相反的方式,IFNULL如下所示:

SELECT
  e.EventId,
  e.EventName,
  GROUP_CONCAT(IFNULL(t.Id,0) SEPARATOR ',') AS EventTypeIDs
FROM Events e
LEFT JOIN EventTypeLink l ON e.EventId = l.EventId
LEFT JOIN EventTypes    t ON l.EventTypeId = t.Id
GROUP BY   e.EventId,  
           e.EventName;
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle Demo适用于没有类型的人

这会给你一些类似的东西:

| EVENTID |        EVENTNAME | EVENTTYPEIDS |
---------------------------------------------
|       1 |            Party |        3,2,1 |
|       2 | EventWithNoTypes |            0 |
Run Code Online (Sandbox Code Playgroud)

  • +1 - 西部最快的枪;-).作为一种习惯,我总是使用`AS`关键字来定义别名.它更具可读性IMO. (2认同)