以下所有3个表都有一个“date_v_end
”字段,这是一个有效日期。只要它是NULL
,这意味着它是当前的“好”值。
例如,要选择表categorie
的当前值,我们只需执行SELECT * FROM categorie WHERE date_v_end IS NULL
。
我有3张桌子:
categorie
(英文类别)categorie_produit
(类别< =>英文产品)produit
(英文版产品)我想查询所有当前 categories
,以及他们的一对多produit
,而我仍然需要一个结果 即使该类别没有商品(=没有produit_categorie
行)。
在拥有“date_v_end
”字段之前,我这样做了:
SELECT
c.id AS c_id,
c.titre AS c_titre,
c.description AS c_description,
cp.id_categorie AS cp_id_categorie,
cp.id_produit AS cp_id_produit,
p.id AS p_id,
p.titre AS p_titre,
p.description AS p_description
FROM categorie_produit cp
LEFT OUTER JOIN categorie c
ON c.id=cp.id_categorie
LEFT OUTER JOIN produit p
ON p.id=cp.id_produit
ORDER BY c_id,p_id;
它就像一个魅力。现在我正在尝试使用新的“date_v_end
”字段修改查询。我添加了三个条款WHERE c.date_v_fin IS NULL AND cp.date_v_fin IS NULL AND p.date_v_fin IS NULL
。你去了:
SELECT
c.id AS c_id,
c.titre AS c_titre,
c.description AS c_description,
cp.id_categorie AS cp_id_categorie,
cp.id_produit AS cp_id_produit,
p.id AS p_id,
p.titre AS p_titre,
p.description AS p_description
FROM categorie_produit cp
LEFT OUTER JOIN categorie c
ON (c.id=cp.id_categorie AND c.date_v_fin IS NULL)
LEFT OUTER JOIN produit p
ON (p.id=cp.id_produit AND p.date_v_fin IS NULL)
WHERE cp.date_v_fin IS NULL
ORDER BY c_id,p_id;
除了在一种情况下,这种情况很好:当有categorie_produit
和时,其“date_v_end
”不 NULL
:在添加这个该死的“date_v_end
”字段之前,我得到了一行,其中c_id,c_titre和c_description已填充,而其他字段NULL
(cp_id_categorie
,{{ 1}},cp_id_produit
,p_id
,p_titre
)。现在没有结果。
我真的不知道如何修改我的查询以使其工作。有什么想法吗?
答案 0 :(得分:1)
您需要将IS NULL
支票移至JOIN中。
在您加入的版本中,无论date_v_fin
字段如何,都会过滤结果。
在下面的查询中,只有在date_v_fin字段为空时才会加入记录。
SELECT
c.id AS c_id,
c.titre AS c_titre,
c.description AS c_description,
cp.id_categorie AS cp_id_categorie,
cp.id_produit AS cp_id_produit,
p.id AS p_id,
p.titre AS p_titre,
p.description AS p_description
FROM
categorie c
LEFT OUTER JOIN
categorie_produit cp
ON c.id=cp.id_categorie
AND cp.date_v_fin IS NULL
LEFT OUTER JOIN
produit p
ON p.id=cp.id_produit
AND p.date_v_fin IS NULL
WHERE
c.date_v_fin IS NULL
ORDER BY
c_id,
p_id