MySQL查询具有多个左连接和每个的不同WHERE子句

时间:2018-01-29 03:45:40

标签: php mysql left-join

我正在修改一个先前已经加入两个表的查询,但是现在需要添加第三个,我正在努力应对一些条件。

这是原始查询:

$sql = "SELECT COUNT(act.rowId) q4Act 
        FROM accounts a 
        LEFT JOIN leads l ON a.accountId = l.accountId 
        LEFT JOIN activities act ON act.leadId = l.leadId AND act.classification = 'Positive' AND activityDate >= '2016-10-31' AND activityDate < '2017-02-01' 
        WHERE a.accountId = '$id' 
        GROUP BY a.accountName ";   

这很好,确保活动表中的唯一结果符合三个AND条件,accountId是被查询的结果。

但是,我拆分了两个表并希望更新此查询。我的第一次尝试是下一个查询,我在其中添加了新的左连接,从第一个中移除了条件并将其添加到第二个。然而,这会产生完全不同的结果。

$sql = "SELECT COUNT(act.rowId) q4Act 
        FROM accounts a 
        LEFT JOIN leads l ON a.accountId = l.accountId 
        LEFT JOIN activities act ON act.leadId = l.leadId AND activityDate >= '2016-10-31' AND activityDate < '2017-02-01' 
        LEFT JOIN interestingMoments im ON im.rowId = act.imId AND im.classification = 'Positive' 
        WHERE a.accountId = '$id' 
        GROUP BY a.accountName ";

我的下一次尝试是将连接下面的新表移动到这样的连接:

$sql = "SELECT COUNT(act.rowId) q4Act 
        FROM accounts a 
        LEFT JOIN leads l ON a.accountId = l.accountId 
        LEFT JOIN activities act ON act.leadId = l.leadId AND activityDate >= '2016-10-31' AND activityDate < '2017-02-01' 
        LEFT JOIN interestingMoments im ON im.rowId = act.imId 
        WHERE a.accountId = '$id' 
        AND im.classification = 'Positive' 
        GROUP BY a.accountName ";   

如果有正数,上面会返回相同的结果,但它不像第一个查询那样返回a 0 count。这不是什么大问题,但我想看看这是否是构建此查询的正确方法。

这是最好的方式,还是我应该采用不同的方式?

1 个答案:

答案 0 :(得分:1)

将约束放在JOIN上而不是WHERE子句中确实没有区别。如果表格很大,可能会影响运行SELECT的时间,但这种差异可能很小,而且索引可能仍然可以减轻这种差异。