この問題は私に本当の頭痛を与えています。
データベースには、「クロージャーテーブル」と呼ばれるデザインを使用してカテゴリの並べ替えを解決する2つのテーブルがあります。最初のテーブルはと呼ばれcategories
、もう1つのテーブルはと呼ばれcategoriesPaths
ます。
カテゴリは単に言語ベースのテーブルです。
id | name
----------------
0 | Category 1
1 | Category 2
カテゴリパスは次のようになります。
parent | children | level
-----------------------
1 | 1 | 0
1 | 2 | 1
2 | 2 | 0
パスを最終的な子ノードと一緒に削除するには、次のクエリを実行します:($ topは、削除が開始される最上位の親ノードレベルです)
DELETE d FROM CategoriesPaths children
JOIN CategoriesPaths a USING (children)
WHERE a.parent = $top;
私がやりたいのは、クエリを変更して、テーブル内の代表的なパスも削除することです。categories
残念ながら、これを行うのに十分なSQLの知識がありません。クエリの前にforeachループを使用して回避策を作成しようとしましたが、categories
テーブルが参照されているため、削除に失敗しcategoriesPaths
ます...とはいえ、私はかなり行き詰まっています。
クロージャーテーブルのデザインについてもっと知りたい場合は、私がそれを学んだスライドシェアへの参照があります:http: //www.slideshare.net/billkarwin/sql-antipatterns-strike-back