2017-02-15 25 views
0

我正在尝试从一个表中获取包含全局统计信息的对象,包括第二个表中的每日统计信息。为此,只要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中有数据。

+0

您已使用左连接。它是答案。请检查没有条件 –

+0

正如我已经说过的,是的:左连接工作**如果** statsTable有数据加入。但是即使没有可用的数据,我也需要一个结果。我应该用什么来代替“Where”? – DosMike1

回答

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子句然后将其过滤掉。

因此,条件第一个表应该在WHERE条款。后续表格的条件应在ON条款中 - 对于LEFT JOIN

+0

优秀深厚的知识:)一个为你描述 –

+0

是有道理和工作。非常感谢你 – DosMike1