Php “为什么我总是感到困惑”;条款,并包含非聚合列“;在codeigniter中运行查询时?

Php “为什么我总是感到困惑”;条款,并包含非聚合列“;在codeigniter中运行查询时?,php,sql,codeigniter,Php,Sql,Codeigniter,我试图根据渠道和产品名称列计算收入总额,以下是我在Codeigniter中使用的查询: $datas['row']=$this->db->query('SELECT channel,product_name, SUM(revenue) AS revenue FROM contribution WHERE YEAR(date) = 2019 GROUP BY channel, SUBSTRING(product_name, 1, 3)')->result(); 但结果总是返回以

我试图根据渠道和产品名称列计算收入总额,以下是我在Codeigniter中使用的查询:

$datas['row']=$this->db->query('SELECT channel,product_name, SUM(revenue) AS revenue FROM contribution WHERE YEAR(date) = 2019 GROUP BY channel, SUBSTRING(product_name, 1, 3)')->result();
但结果总是返回以下消息:“SELECT list的表达式#2不在GROUP BY子句中,并且包含未聚合的列'datamart.contribution.product_name',该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode=仅_full_GROUP BY不兼容”

但如果我将查询更改为:

$datas['row']=$this->db->query('SELECT channel,product_name, SUM(revenue) AS revenue FROM contribution WHERE YEAR(date) = 2019 GROUP BY channel, product_name')->result();

它成功返回值,但不是我想要的。它返回仅按渠道而不是产品名称分组的收入总和。我需要基于渠道和产品名称的收入总和。

如果仅通过子字符串进行聚合,则不能选择
产品。您需要一个:

SELECT channel, MIN(product_name) as product_name, SUM(revenue) AS revenue
FROM contribution
WHERE YEAR(date) = 2019
GROUP BY channel, SUBSTRING(product_name, 1, 3);
或:

你到底想要哪一个还不清楚

此外,我建议您将
WHERE
子句重写为:

WHERE date >= '2019-01-01' AND date < '2020-01-01'
其中日期>='2019-01-01'和日期<'2020-01-01'

这使得优化器更容易使用索引和分区。

谢谢您的回答,第一个是“适合我的”
WHERE date >= '2019-01-01' AND date < '2020-01-01'