Mysql
如何設置一對多關係的父母?
我有桌子
CREATE TABLE articles ( id varchar(10), parent_id varchar(10), Text text, FOREIGN KEY(parent_id) REFERENCES articles(id) ON DELETE CASCADE, PRIMARY KEY(id) ) ENGINE=InnoDB CREATE TABLE article_map ( id varchar(10), unified_id int(11), FOREIGN KEY(id) REFERENCES articles(id) ON DELETE CASCADE, PRIMARY KEY(id,unified_id) ) ENGINE=InnoDB
對於每個
unified_id
,有幾個id
s。目的是保存id
表中的所有sarticle
以避免再次添加,但將其中一個設置為父級,並將重置為子級。在這種情況下,所有子級的內容 (Text
) 都設置NULL
為,並且對子級的任何請求都會重定向到父級。如何
INSERT
從一個表到另一個article_map
表articles
設置一個父級和每個分配的父級的重置子級unified_id
?沒有選擇父母的偏好。
您可以使用
CASE
相關子查詢。在子查詢中選擇該
id
行的最小值unified_id
。如果該行
id
等於此最小值,則 parent 為空,使文章成為父項。如果它不等於最小值,則它是具有最小值的文章的子項id
。然後將最小值設置id
為父級。INSERT INTO articles (id, parent_id) SELECT amo.id id, CASE WHEN amo.id = (SELECT min(ami.id) FROM article_map ami WHERE ami.unified_id = amo.unified_id) THEN null ELSE (SELECT min(ami.id) FROM article_map ami WHERE ami.unified_id = amo.unified_id) END parent FROM article_map amo;
或者您可以使用聯合。首先使用最小值和 a 選擇所有父母
GROUP BY unified_id
。將其與父母INNER JOIN
的一個統一起來。article_map
INSERT INTO articles SELECT min(am.id) id, null FROM article_map am GROUP BY am.unified_id UNION ALL SELECT amo.id id, p.id parent FROM article_map amo INNER JOIN (SELECT min(ami.id) id, ami.unified_id FROM article_map ami GROUP BY ami.unified_id) p ON p.unified_id = amo.unified_id AND p.id <> amo.id;
(當然,最小值和最大值(可能還有其他)在這裡可以互換。)