Mysql

MYSQL:多對多連接

  • January 14, 2015

我正在嘗試創建一個視圖並嘗試查看可以做什麼,我有一個主表,一個我想加入的表,還有一個連接表。

Event table (it's very big so it's just dummy data):

+----+----------+----------+
| id | somethin | somethin |
+----+----------+----------+
|  1 | value    | value    |
+----+----------+----------+

Junction Table:

+----+----------+----------+
| id | event_id | label_id |
+----+----------+----------+
|  1 |        1 |        1 |
+----+----------+----------+

Labels Table:

+----+--------+-----------+
| id | name   | value     |
+----+--------+-----------+
|  1 | Name1  | Value1    |
+----+--------+-----------+

所以我要完成的工作我不確定是否可能,標籤會有很多不同的名稱和一定數量的值,所以想像一下

+----+--------+-----------+
| id | name   | value     |
+----+--------+-----------+
|  1 | Name1  | Value1    |
+----+--------+-----------+
|  1 | Name1  | Value2    |
+----+--------+-----------+
|  1 | Name2  | Value3    |
+----+--------+-----------+
|  1 | Name2  | Value4    |
+----+--------+-----------+

所以這是我希望在連接表上擁有來自事件表的所有數據的棘手部分,除此之外,在標籤名稱和對應於該事件的值之後的列名。像這樣的東西

+----+----------+----------+----------+----------+
| id | Name     | Place    | Name1    | Name2    |
+----+----------+----------+----------+----------+
|  1 | value    | value    | Value2   | Null     |
+----+----------+----------+----------+----------+

因此,無論該記錄是否有標籤,名稱列都將存在,但如果沒有任何內容,它將顯示 null 。

甚至可能嗎?

您不能擁有動態調整返回的列數的視圖。這是您需要使用客戶端邏輯實現的東西。至少對於我知道的所有數據庫(你沒有提到你使用哪個數據庫系統)。

您可以在不同的別名下多次連接標籤表,在 where 子句中指定第二個連接的條目不等於第一個。第 3 次的參賽作品不等於第 1 次或第 2 次等。

例如

假設我們有一桌人

id name
1 Paul
2 James
3 Scott

以及他們去過的地方的表格

id peopleid placename
1 1 Africa
2 1 Australia
3 2 Africa

然後我們可以有一個像這樣的查詢

select n.name, p1.placename, p2.placename
from name as n
left outer join place as p1 on p1.peopleid = n.id
left outer join place as p2 on p2.peopleid = n.id
where p2.id != p1.id

對於這些結果:

Paul Africa Australia
James Africa NULl
Scott NULL NULL

引用自:https://dba.stackexchange.com/questions/63407