0

在我的数据库中有一个类别表。为了分层次地选择这些类别,我正在寻找一种方法来填充联结表中的父ID(如下所示)。现在,只有sort_order 1行的父ID已经被填充。根据以前的行填充(更新)父ID?

+----------------------+ 
|category_relationships| 
+----------------------+ 
+----+-------------+-----------------+-----------+----------------+ 
| id | link_id[FK] | category_id[FK] | parent_id[FK] | sort_order | 
+----+-------------+-----------------+-----------+----------------+ 
| 1  2    1     1    1  | 
| 2  2    133    1    2  | 
| 3  3    2     2    1  | 
| 4  3    200    2    2  | 
| 5  3    333    200    3  | 
| 6  4    1     1    1  | 
| 7  5    3     3    1  | 
| 8  5    222    3    2  | 
| 9  5    223    222    3  | 
| 10  5    456    223    4  | 
+-----------------------------------------------------------------+ 

上面的示例数据是我正在做的。正如你所看到的,所有的行都有link_id的共同点。这是分类类别组的专栏。但我也需要使用sort_order列来确定每个parent_id是如何相关的,它是有序的。这是我试过的方式,但它不会更新任何行。

UPDATE category_relationships SET parent_id= 
(
SELECT category_id FROM 
    (
    SELECT link_id, category_id, sort_order 
    FROM category_relationships 
) AS t1 
WHERE t1.link_id = category_relationships.link_id 
AND t1.sort_order = 1 
) 
WHERE sort_order = 2; 

这种做法不会做一次全部,但没关系,我可以填充他们一次在一个级别。

回答

0

我能用SELF JOIN解决这个问题。

UPDATE category_relationships a 
LEFT JOIN category_relationships b ON 
(a.link_id = b.link_id AND b.sort_order = 1) <--source row 
SET a.parent_id = b.category_id 
WHERE a.sort_order = 2; <--destination row 

本质上这是什么一样,是把原始表和彼此相邻与具有在JOIN条件中指定的数据的第二表中的不同的版本。然后UPDATE语句使用第二个表作为添加记录的参考。