Mysql

如何設置一對多關係的父母?

  • May 7, 2018

我有桌子

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,有幾個ids。目的是保存id表中的所有sarticle以避免再次添加,但將其中一個設置為父級,並將重置為子級。在這種情況下,所有子級的內容 ( Text) 都設置NULL為,並且對子級的任何請求都會重定向到父級。

如何INSERT從一個表到另一個article_maparticles設置一個父級和每個分配的父級的重置子級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;

(當然,最小值和最大值(可能還有其他)在這裡可以互換。)

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