【问题标题】:Get columns from two tabels with fallback value从具有后备值的两个表中获取列
【发布时间】:2017-02-15 11:28:47
【问题描述】:

我目前正在尝试从一个包含全局统计信息的表中获取一个对象,包括第二个表中的每日统计信息。为此,我使用以下连接查询,只要 statsTable 包含“oID”和“Date”列的匹配行。

SELECT
  o.ID as ID,
  o.Image as Image,
  o.Text as `Text`,
  o.Views as `Views`,
  o.Clicks as Clicks,
  COALESCE(s.Views, 0) as DayViews,
  COALESCE(s.Clicks, 0) as DayClicks
FROM objectTable o
LEFT JOIN statsTable s
ON o.ID = s.oID
WHERE o.userID = 1
  AND DATEDIFF(CURDATE(), s.Date) < 1
LIMIT 1

即使 statsTable 不包含匹配行,我如何必须更改查询才能获得结果行?

查询没有给出错误,我只是不希望它返回空结果,因为我确定 objectTable 中有数据。

【问题讨论】:

  • 您已经使用了左连接。这是答案。请检查无where条件
  • 正如我已经说过的,是的:左连接有效 if statsTable 有数据要连接。但即使没有可用数据,我也想要一个结果。我应该用什么来代替Where

标签: mysql select left-join multiple-tables fallback


【解决方案1】:

您只需将s 表上的条件移动到ON 子句中:

SELECT o.ID as ID, o.Image as Image, o.Text as `Text`,
       o.Views as `Views`, o.Clicks as Clicks,
       COALESCE(s.Views, 0) as DayViews,
       COALESCE(s.Clicks, 0) as DayClicks
FROM objectTable o LEFT JOIN
     statsTable s
     ON o.ID = s.oID AND DATEDIFF(CURDATE(), s.Date) < 1
WHERE o.userID = 1 ;

LEFT JOIN 将所有行保留在第一个表中,无论 ON 子句的计算结果是否为真。第二个表中的列是 NULL 用于不匹配的行 - 然后 WHERE 子句将其过滤掉。

因此,first 表上的条件应该在WHERE 子句中。后续表的条件应在ON 子句中——对于LEFT JOIN

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 2015-07-16
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多