[英]SQL Query count rows where multiple column-values
所以这是我的 MySQL 表的样子(我有数千行):
| ID | date | Color | IUSERQ |
| 1 | 2020-09-25 18:55:54 | RED | GGW3 |
| 2 | 2020-09-25 18:24:12 | RED | FFQ3 |
| 3 | 2020-09-24 17:32:52 | RED | GWW3 |
| 4 | 2020-09-23 17:42:37 | BLUE | JJN6 |
| 5 | 2020-09-23 17:33:55 | BLUE | VVV5 |
| 6 | 2020-09-23 18:53:57 | RED | FFQ3 |
| 7 | 2020-09-22 18:15:11 | BLUE | FFQ3 |
现在要计算所有行并将它们按周分组,我这样做:
if($stmt = $link->query("SELECT WEEK(date),COUNT(*) FROM sales WHERE color='RED' AND YEAR(date) = YEAR(NOW()) GROUP BY WEEK(date) order by MONTH(date) ASC")){
$php_data_array = Array(); // create PHP array
while ($row = $stmt->fetch_row()) {
$php_data_array[] = $row; // Adding to array
}
}else{
echo $link->error;
}
echo json_encode($php_data_array);
在echo json_encode($php_data_array);
,它给出了当前输出: [["36","154"],["37","247"],["38","275"]]
。 所以数组 (36, 37, 38) 中的第一个字符串是周数,第二个是颜色为红色的行数。 现在,我还想在同一个数组中添加颜色为 BLUE 的位置,因此预期值应该类似于: [["36","154","166"],["37","247","265"],["38","275","298"]]
。
我应该使用什么方法来做到这一点?
只需添加另一列:
SELECT WEEK(date) as week, SUM(color = 'RED') as red, SUM(color = 'BLUE') as blue
FROM sales
WHERE color IN ('RED', 'BLUE') AND YEAR(date) = YEAR(NOW())
GROUP BY WEEK(date)
ORDER BY WEEK(date) ASC;
请注意对查询的更改:
SUM()
对每种颜色进行条件聚合。ORDER BY
由被聚合的列决定。使用条件聚合:
select week(date) week_date, sum(color = 'RED') cnt_red, sum(color = 'BLUE') cnt_blue
from sales
where color in ('RED', 'BLUE') and date >= date_format(current_date, '%Y-%m-01')
group by week(date)
order by week_date
请注意,这对date
列使用直接过滤,而不是在过滤列上应用函数。 这比year(date) = year(now())
更有效,特别是如果您在该列上有索引。
我还更改了order by
子句:显然,您希望按周而不是月进行排序(在大多数数据库中,这是一个编译错误,因为月不属于group by
子句)。
您可以使用动态查询作为另一种选择:
SET @sql = NULL;
SELECT GROUP_CONCAT(
DISTINCT
CONCAT(
'SUM( color =''', color, ''' ) AS ',color
)
)
INTO @sql
FROM sales s;
SET @sql = CONCAT('SELECT WEEK(date) AS WEEK,',@sql,
' FROM sales
WHERE YEAR(date) = YEAR(NOW())
GROUP BY WEEK
ORDER BY WEEK');
然后从 php 代码块调用,例如:
if($stmt = $link->query( @sql )){ ....
$php_data_array = Array(); // create PHP array
....
这样,无需添加要单独分组的每个颜色名称,查询会透视表中存在的所有颜色列值。 可能会添加新颜色或删除现有颜色,而无需构建新查询。
Demo (为了显示查询结果)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.