2017-08-25 139 views
1

我有以下查询:没有组聚合列由

select 
    count(*) as leads, 
    (select count(*) from assignments where lead_id=leads.id and deleted_at is null) as assignments, 
    (select count(*) from assignments where lead_id=leads.id and deleted_at is not null) as returns, 
    date_format(leads.updated_at, "%m/%d/%Y") as date 
from `leads` where leads.updated_at between "2017-08-24 04:00:00" and "2017-08-26 03:59:59" 
group by `date` 

这产生了以下错误:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'leadbind.leads.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select count() as leads, (select count() from assignments where lead_id=leads.id and deleted_at is null) as assignments, (select count(*) from assignments where lead_id=leads.id and deleted_at is not null) as returns, date_format(leads.updated_at, "%m/%d/%Y") as date from leads where leads.updated_at between "2017-08-24 04:00:00" and "2017-08-26 03:59:59" group by date)

是否有可能解决此同时仍保持group by date?我想保留子查询。

回答

-2

应该

group by date_format(leads.updated_at, "%m/%d/%Y") , leads.id 

集团首先谈到选择之前执行

+0

如果'updated_at'是DATETIME或TIMESTAMP,那么你的回答是错误的。无论如何,它不回答这个问题。 –

+0

再试一次... – maSTAShuFu

+0

现在它解决了这个错误,但可能不会给出OP的预期结果。 –

1

的错误是常见的一种SQL的层次。它来自有关GROUP BY查询的规则:您不能让列产生不明确的结果。您的选择列表中的所有列必须位于GROUP BY子句中,或位于聚合函数内,否则在功能上依赖于GROUP BY子句中的列。

,详细了解这个规则,阅读https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

你的子查询列assignmentsreturns违反了这一规则。每个date有多个id。因此,您希望计算结果的数量是多少?我想你会希望给定日期的所有id值的总分配和返回。

select 
    count(*) as leads, 
    SUM((select count(*) from assignments where lead_id=leads.id and deleted_at is null)) as assignments, 
    SUM((select count(*) from assignments where lead_id=leads.id and deleted_at is not null)) as returns, 
    date_format(leads.updated_at, '%m/%d/%Y') as date 
from `leads` 
where leads.updated_at between '2017-08-24 04:00:00' and '2017-08-26 03:59:59' 
group by `date` 

我将字符串分隔符更改为更为标准的单引号。

我将使用一个连接,而不是做两分相关子查询进一步编写这个查询:

select 
    count(*) as leads, 
    COUNT(CASE WHEN a.deleted_at is null THEN a.lead_id END)) as assignments, 
    COUNT(CASE WHEN a.deleted_at is not null THEN a.lead_id END)) as returns, 
    date_format(leads.updated_at, '%m/%d/%Y') as date 
from `leads` as l 
left outer join `assignments` as a on l.id = a.lead_id 
where leads.updated_at between '2017-08-24 04:00:00' and '2017-08-26 03:59:59' 
group by `date` 

COUNT(expr)其中EXPR为空不计行。