SQL查询,有效日期和连接:如何使其工作?

时间:2012-04-23 15:24:09

标签: mysql sql

以下所有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已填充,而其他字段NULLcp_id_categorie,{{ 1}},cp_id_produitp_idp_titre)。现在没有结果。

我真的不知道如何修改我的查询以使其工作。有什么想法吗?

1 个答案:

答案 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