2

2 つのテーブル間に標準的な多対多の関係があり、3 番目のリンク テーブルを使用してリンクされています。リンクされたIDをクエリで1つのレコードに結合する方法はありますか?

典型的な結合を処理し、これを使用して新しいリストを作成できることに気付きましたが、クエリで実行できるかどうか疑問に思っています。例:

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         |
+-------------+-------------+
4

1 に答える 1

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;

SQL フィドルのデモ

これにより、次のことが得られます。

| EVENTID | EVENTNAME | EVENTTYPEIDS |
--------------------------------------
|       1 |     Party |        1,2,3 |

注意:タイプのないイベントを含める必要がある場合は、LEFT JOIN代わりにa を次の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;

型がない人のための SQL Fiddle Demo

これにより、次のような結果が得られます。

| EVENTID |        EVENTNAME | EVENTTYPEIDS |
---------------------------------------------
|       1 |            Party |        3,2,1 |
|       2 | EventWithNoTypes |            0 |
于 2013-01-03T04:23:34.407 に答える