本文介紹了在MySQL中使用三個表填充多對多人-顏色表的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試在MySQL中規范化一個表,將一個具有許多相似列的表轉換為具有兩個列的多對多關系。我有以下表格:
人員:
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Anna |
| 3 | Leon |
+----+------+
Person_Temp:
+------+--------+--------+--------+--------+
| name | color1 | color2 | color3 | color4 |
+------+--------+--------+--------+--------+
| John | red | blue | green | |
| Anna | green | yellow | | |
| Leon | blue | red | | |
+------+--------+--------+--------+--------+
顏色:
+----+--------+
| id | name |
+----+--------+
| 1 | red |
| 2 | blue |
| 3 | green |
| 4 | yellow |
+----+--------+
我想在填充多對多關系表后刪除PERSON_TEMP:
人色:
+-----------+----------+
| person_id | color_id |
+-----------+----------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
| 2 | 4 |
| 3 | 2 |
| 3 | 1 |
+-----------+----------+
但是,我還沒有找到我的查詢的任何解決方案。我與人員ID的唯一關系是Person_Temp中的名稱。我知道姓名在人稱中是唯一的,因此使用它們進行查詢不成問題。
我嘗試使用此SQL,但它不起作用,因為Person_Temp沒有id列。
INSERT INTO `person_color`
SELECT p.id, c.id
FROM (
SELECT id, color1 color
FROM person_temp
UNION
SELECT id, color2 FROM person_temp
UNION
SELECT id, color3 FROM person_temp
UNION
SELECT id, color4 FROM person_temp
UNION
SELECT id, color5 FROM person_temp
) p
JOIN color c
ON c.name = p.color;
推薦答案
您的原始查詢簡單明了。除了從person_temp
中選擇name
而不是id
,您只需將name
與id
中的id
連接在一起。您不需要單獨對person_temp
執行所有這些聯接。
INSERT INTO person_color
SELECT p.id AS person_id, c.id AS color_id
FROM (
SELECT name, color1 AS color FROM person_temp
UNION
SELECT name, color2 FROM person_temp
UNION
SELECT name, color3 FROM person_temp
UNION
SELECT name, color4 FROM person_temp
UNION
SELECT name, color5 FROM person_temp
) nc
JOIN color c
ON c.name = nc.color
JOIN person p
ON p.name = nc.name;
表行沒有順序,因此在插入中ORDER BY p.id, c.id
是沒有意義的。輸出行有順序。
無論是在提出關系設計的意義上,還是在更高范式的意義上,您都沒有實現規范化。您只是在改進設計。
這篇關于在MySQL中使用三個表填充多對多人-顏色表的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,