【问题标题】:LEFT JOIN + Multiple WHERE ClausulesLEFT JOIN + 多个 WHERE 子句
【发布时间】:2014-05-25 07:46:14
【问题描述】:

我在编写 SQL 查询时遇到问题。我将通过我的 SQL 查询来解释:

SELECT p.Code, p.Name, SUM(h.PA = 1) AS PA, SUM(h.PB = 1) AS PB, 
    SUM(h.PG = 1) AS PG, SUM(h.GoedkeuringDoorNew = 'GF') AS GF,
    SUM(h.GoedkeuringDoorNew = 'SB') AS SB, 
    SUM(h.GoedkeuringDoorNew = 'VIA') AS VIA, sum(h.Blanco) AS Blanco
FROM psthostess p
LEFT JOIN `psttodo-uit` h ON h.`Hostess Code` = p.Code
WHERE p.Indienst = 1 AND DATE(h.`afgewerkt tablet datum`) = CURDATE()
GROUP BY p.Code, p.Name

如您所见,我有一个带有 Indienst = 1date = today 的 WHERE 分句。我做了一个LEFT JOIN,所以我得到了所有的字段(也是空的)。我刚刚添加了AND DATE(h.afgewerkt tablet datum) = CURDATE()。所以在我得到 18 行之前,现在我只得到一个,因为他还检查了日期。

但我想要 18 行,还有 p.Indienst = 1 但没有 DATE = CURDATE 的行。

我该怎么做?

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集。
  • @Strawberry:nielsv 的要求你不清楚吗?我认为他很清楚地解释了他的问题。
  • @ThorstenKettner 我不清楚 nielsv 是否想要 NULL 或 0 作为缺失结果的总和。

标签: mysql sql date join


【解决方案1】:

AND DATE(h.afgewerkt tablet datum) = CURDATE()移动到ON子句:

SELECT p.Code, p.Name, SUM(h.PA = 1) AS PA, SUM(h.PB = 1) AS PB, 
    SUM(h.PG = 1) AS PG, SUM(h.GoedkeuringDoorNew = 'GF') AS GF,
    SUM(h.GoedkeuringDoorNew = 'SB') AS SB, 
    SUM(h.GoedkeuringDoorNew = 'VIA') AS VIA, sum(h.Blanco) AS Blanco
FROM psthostess p
LEFT JOIN `psttodo-uit` h ON h.`Hostess Code` = p.Code
AND DATE(h.`afgewerkt tablet datum`) = CURDATE()
WHERE p.Indienst = 1 
GROUP BY p.Code, p.Name

【讨论】:

    【解决方案2】:

    好吧,如果您想要所有记录,还有那些没有“今天”作为日期的记录,您为什么首先要过滤今天?只需删除该子句,就可以了。或者,但这很荒谬,因为它与删除额外的子句一样,将 WHERE 更改为:

    WHERE (p.Indienst = 1 AND DATE(h.`afgewerkt tablet datum`) = CURDATE())
        OR (p.Indienst = 1 AND DATE(h.`afgewerkt tablet datum`) != CURDATE())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2021-02-15
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多