次のように、ツリー内のすべてのノードの祖父母をフェッチしています。
SELECT P.id, P.parent, GP.parent gp_id FROM product_groups P
INNER JOIN product_groups GP ON P.parent = GP.id
テーブルにはid=0
のエントリはありませんが、ツリーのルートを示すparent=0
のエントリがあります。これらの行は、結合する祖父母がいないため、このクエリではフェッチされません。 NULL
と0
の両方にgp_id
(またはparent
)を付けて、これらの行を返してほしい。
UNION
を使用して2番目のテーブルを(0,0)
で計画する予定でしたが、構文を理解できません。これを行う方法?
LEFT JOIN
代わりに:
SELECT P.id, P.parent, GP.parent gp_id FROM product_groups P
LEFT JOIN product_groups GP ON P.parent = GP.id
これはP
からすべての行を返し、GP
内の一致しない行はNULL
値を持ちます。
SELECT P.id, P.parent,
GP.parent, GP.gp_id
FROM product_groups P
INNER JOIN product_groups GP
ON P.parent = GP.id
UNION
SELECT P.id, P.parent,
0 AS GP.parent, 0 AS gp_id
FROM product_groups P
WHERE NOT EXISTS (
SELECT *
FROM product_groups GP
WHERE P.parent = GP.id
);