Php 多个左联接不使用子查询
我知道有一个类似的问题已经发布了,但我无法通过尝试在谷歌上找到的东西来找到我的sql查询的问题 我得到的错误是“您的SQL语法有错误” 这是我的密码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
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您只需重复求和代码>之间具有不同的属性。这就是路。戈登只要先给你看一下。对其他人也一样