Php 多个左联接不使用子查询

Php 多个左联接不使用子查询,php,mysql,sql,Php,Mysql,Sql,我知道有一个类似的问题已经发布了,但我无法通过尝试在谷歌上找到的东西来找到我的sql查询的问题 我得到的错误是“您的SQL语法有错误” 这是我的密码 select campaigns.campaign_name, calls.count, first.count as first, second.count as second, third.count as third, fourth.count as fourth, fifth.cou

我知道有一个类似的问题已经发布了,但我无法通过尝试在谷歌上找到的东西来找到我的sql查询的问题

我得到的错误是“您的SQL语法有错误”

这是我的密码

select 
    campaigns.campaign_name,
    calls.count,
    first.count as first,
    second.count as second,
    third.count as third,
    fourth.count as fourth,
    fifth.count as fifth,
    sixth.count as sixth
    from campaigns
    LEFT JOIN 
    (
        select count(*) as count, campaign_id FROM calls where direction = 'Incoming' group by campaign_id
    ) as calls
    ON campaigns.id = calls.campaign_id
    LEFT JOIN 
    (
        select count(*) as count, 
        campaign_id FROM calls 
        where direction = 'Incoming' 
        AND DATE(created_at) BETWEEN '2014-01-01' AND '2016-01-01'
        group by campaign_id
    ) as first
    LEFT JOIN 
    (
        select count(*) as count, 
        campaign_id FROM calls 
        where direction = 'Incoming' 
        AND DATE(created_at) BETWEEN '2014-01-01' AND '2016-01-01'
        group by campaign_id
    ) as second
    ON campaigns.id = second.campaign_id
    LEFT JOIN 
    (
        select count(*) as count, 
        campaign_id FROM calls 
        where direction = 'Incoming' 
        AND DATE(created_at) BETWEEN '2014-01-01' AND '2016-01-01'
        group by campaign_id
    ) as third
    ON campaigns.id = third.campaign_id
    LEFT JOIN 
    (
        select count(*) as count, 
        campaign_id FROM calls 
        where direction = 'Incoming' 
        AND DATE(created_at) BETWEEN '2014-01-01' AND '2016-01-01'
        group by campaign_id
    ) as fourth
    ON campaigns.id = fourth.campaign_id
    LEFT JOIN 
    (
        select count(*) as count, 
        campaign_id FROM calls 
        where direction = 'Incoming' 
        AND DATE(created_at) BETWEEN '2014-01-01' AND '2016-01-01'
        group by campaign_id
    ) as fifth
    ON campaigns.id = fifth.campaign_id
    LEFT JOIN 
    (
        select count(*) as count, 
        campaign_id FROM calls 
        where direction = 'Incoming' 
        AND DATE(created_at) BETWEEN '2014-01-01' AND '2016-01-01'
        group by campaign_id
    ) as sixth
    ON sixth.campaign_id = campaigns.id
    group by campaigns.id
错误似乎出现在第69行
sql查询的最后第二行
在sixth.campaign\u id=campaims.id

没有理由进行如此复杂的查询。只需使用条件聚合:

select c.campaign_name,
       sum(direction = 'Incoming') as cnt,
       sum(direction = 'Incoming' and DATE(created_at) BETWEEN '2014-01-01' AND '2016-01-01') as first,
       . . .
from campaigns c left join
     calls
     on c.campaign_id = calls.campaign_id
group by c.campaign_name;

所有条件看起来都相同,但您可以为其他条件添加附加的
sum()
s。

在“first”之后缺少ON子句。冗余分组,因为在子查询中已经进行了计数。日期之间会随着每次连接而改变。我仍然可以解决它吗?@Muhammad可能不是因为这不是你提出的问题。是的,日期之间可以针对每个条件进行修改,正如@Gordon所演示的那样。@JuanCarlosOropeza是的,jarlh发现了代码的问题,但正如他所说的在评论中回答了这个问题,我想我不能把它标记为答案,但我对如何缩短这个问题很感兴趣,所以问了戈登一个问题-Thanks@Muhammad您只需重复
求和之间具有不同的属性。这就是路。戈登只要先给你看一下
。对其他人也一样