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

Php 具有多个左连接和不同WHERE子句的MySQL查询,php,mysql,left-join,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.lea

我正在修改一个查询,该查询以前连接了两个表,但现在需要添加第三个表,并且我正在努力解决应用的一些条件

这是原始查询:

我的下一次尝试是在联接下面的新表上移动条件,如下所示:

$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 ";   
当有正计数时,上面的方法返回相同的结果,尽管它不像第一个查询那样返回0计数。这不是什么大问题,但我想看看这是否是构造此查询的正确方法


这是最好的方法,还是应该换一种方法?

将约束放在连接上与放在WHERE子句中实际上没有什么区别。如果表很大,则可能会影响运行SELECT的时间,但这种差异可能很小,并且仍然可以通过索引来缓解。

是im.classification=act.classification吗?如果是,为什么不在条件中添加此项?@Mahesh我对此不清楚,act.CLASSION已不存在,这是活动表的一部分,被拆分并放入单独的兴趣表中table@sorak您的意思是将其指定为ON字段?act.activityDate对于activities表来说是唯一的,我担心-唯一的公共字段是leadIdI,我只是说我在任何地方都使用表别名,即使字段名是唯一的,因为它使事情更加明显,并消除了可能的意外。我在重新阅读了这些查询后删除了它,并认为这真的无关紧要。灌木丛。你不清楚。请解释什么被分割成什么。同时给出相关的约束条件。显然,从你的评论来看,这是一个活动,至少是活动和有趣的时刻。你需要知道如何重建活动。然后,您可以在第一个查询中将其替换为子查询。尽管可能有一个不受欢迎的等价物。请通过编辑您的帖子而不是评论来澄清。请阅读并采取行动。PS阅读一些内连接和外连接的定义和示例。外部联接返回内部联接行加上由null扩展的不匹配的左表行。如果是这种情况,三个查询不应该基本上返回相同的结果吗?但是第二个查询有不同的结果。查询2将返回没有任何关联的有趣时刻的活动。查询3在WHERE子句中具有im.classification约束,因此需要存在感兴趣的时刻的记录才能返回任何内容。查询3返回正确的数字,但如果没有感兴趣的时刻,则不会返回任何内容,而查询1仍然会返回一些内容,因为它找到了帐户。Q3在那一点上甚至找不到帐户,那么是否有更好的方法来构造查询,或者我是否应该让它保持足够的独立性?左联接背后的思想是,即使您要联接的表(位于结果集右侧)没有返回任何值,它仍然会在左侧返回值。将约束移动到WHERE子句中,使其成为返回记录的规则,而不是只加入额外数据。什么意思?它返回正确的数字?Q1返回正确的有趣时刻计数,而Q2不返回。Q3也返回正确的计数,唯一的区别是,如果感兴趣的时刻的计数=0,那么它将不返回任何值,而Q1返回的计数为0。我猜这可能是我使用了错误的连接类型?
$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 ";