MySQL GROUP BY 列并在同一 table 中有条件地计算另一列
MySQL GROUP BY column and COUNT another column conditionally in the same table
我正在尝试从 MySQL 数据库中查询 table reviews
。每行代表对产品的评论。相关列的数据存储如下:
{ product_id: 25, rating: 1, recommend: 'false' },
{ product_id: 25, rating: 4, recommend: 'true' },
{ product_id: 25, rating: 3, recommend: 'true' },
{ product_id: 25, rating: 2, recommend: 'false' },
{ product_id: 25, rating: 1, recommend: 'false'}
我需要获得每种类型评分的总和(例如,有多少条评论给它打了“1”),然后统计有多少评论推荐“正确”,有多少评论推荐“错误”。我想像这样查询 return 数据:
{ product_id: 25, rating: 1, total: 2, recommendTrue: 2, recommendFalse: 3},
{ product_id: 25, rating: 2, total: 1, recommendTrue: 2, recommendFalse: 3},
{ product_id: 25, rating: 3, total: 1, recommendTrue: 2, recommendFalse: 3},
{ product_id: 25, rating: 4, total: 1, recommendTrue: 2, recommendFalse: 3},
从技术上讲,我不需要在每一行都使用 recommendTrue 和 recommendFalse,但因为我是按评级类型分组的,所以冗余度很好。
当我使用这个查询时 (A):
'SELECT product_id, rating, COUNT(rating) as total'
' ' + 'FROM reviews'
' ' + 'WHERE reviews.product_id = ?'
' ' + 'GROUP BY rating'
' ' + 'LIMIT 50'
我得到了部分想要的结果:
{ product_id: 25, rating: 1, total: 1 },
{ product_id: 25, rating: 3, total: 1 },
{ product_id: 25, rating: 2, total: 3 },
{ product_id: 25, rating: 5, total: 1 },
{ product_id: 25, rating: 4, total: 2 }
我现在需要计算 product_id 25 的所有评论中正确和错误推荐的总数。
我正在尝试这个查询 (B):
"SELECT r.product_id, COUNT(r.recommend='false') as F, COUNT(r.recommend='true') as T"
" " + "FROM reviews AS r"
" " + "WHERE r.product_id = ?"
" " + "GROUP BY r.rating"
" " + "LIMIT 50"
得到这个结果:
{ product_id: 25, F: 1, T: 1, rating: 1, total: 1 },
{ product_id: 25, F: 1, T: 1, rating: 3, total: 1 },
{ product_id: 25, F: 3, T: 3, rating: 2, total: 3 },
{ product_id: 25, F: 1, T: 1, rating: 5, total: 1 },
{ product_id: 25, F: 2, T: 2, rating: 4, total: 2 }
推荐需要分别计算真假,但不应单独计算评级。我写的方式是计算每个评级的所有推荐(正确和错误)。
您有两个单独的查询:一个用于 true/false,一个用于评级。
您可以使用连接语句将两者结合起来。连接中的查询将计算 true/false,然后将结果与评级查询组合:
select product_id, rating, count(*), t, f
from reviews
join (
select
sum(if(recommend='true', 1, 0)) as t,
sum(if(recommend='false', 1, 0)) as f
from reviews
where product_id=?
) as q
where product_id=?
group by product_id, rating, t, f
参见db-fiddle。
如果您使用支持 window 函数的 MySQL 8+,您可以尝试使用 SUM() OVER ()
函数作为基本查询,然后将其作为子查询来执行COUNT()
和分组。像这样:
SELECT product_id, rating,
COUNT(product_id) AS total,
recommendTrue,
recommendFalse
FROM
(SELECT product_id, rating,
SUM(recommend='true') OVER () AS recommendTrue,
SUM(recommend='false') OVER () AS recommendFalse
FROM reviews r
WHERE r.product_id = '25') A
GROUP BY product_id, rating, recommendTrue, recommendFalse
我正在尝试从 MySQL 数据库中查询 table reviews
。每行代表对产品的评论。相关列的数据存储如下:
{ product_id: 25, rating: 1, recommend: 'false' },
{ product_id: 25, rating: 4, recommend: 'true' },
{ product_id: 25, rating: 3, recommend: 'true' },
{ product_id: 25, rating: 2, recommend: 'false' },
{ product_id: 25, rating: 1, recommend: 'false'}
我需要获得每种类型评分的总和(例如,有多少条评论给它打了“1”),然后统计有多少评论推荐“正确”,有多少评论推荐“错误”。我想像这样查询 return 数据:
{ product_id: 25, rating: 1, total: 2, recommendTrue: 2, recommendFalse: 3},
{ product_id: 25, rating: 2, total: 1, recommendTrue: 2, recommendFalse: 3},
{ product_id: 25, rating: 3, total: 1, recommendTrue: 2, recommendFalse: 3},
{ product_id: 25, rating: 4, total: 1, recommendTrue: 2, recommendFalse: 3},
从技术上讲,我不需要在每一行都使用 recommendTrue 和 recommendFalse,但因为我是按评级类型分组的,所以冗余度很好。
当我使用这个查询时 (A):
'SELECT product_id, rating, COUNT(rating) as total'
' ' + 'FROM reviews'
' ' + 'WHERE reviews.product_id = ?'
' ' + 'GROUP BY rating'
' ' + 'LIMIT 50'
我得到了部分想要的结果:
{ product_id: 25, rating: 1, total: 1 },
{ product_id: 25, rating: 3, total: 1 },
{ product_id: 25, rating: 2, total: 3 },
{ product_id: 25, rating: 5, total: 1 },
{ product_id: 25, rating: 4, total: 2 }
我现在需要计算 product_id 25 的所有评论中正确和错误推荐的总数。
我正在尝试这个查询 (B):
"SELECT r.product_id, COUNT(r.recommend='false') as F, COUNT(r.recommend='true') as T"
" " + "FROM reviews AS r"
" " + "WHERE r.product_id = ?"
" " + "GROUP BY r.rating"
" " + "LIMIT 50"
得到这个结果:
{ product_id: 25, F: 1, T: 1, rating: 1, total: 1 },
{ product_id: 25, F: 1, T: 1, rating: 3, total: 1 },
{ product_id: 25, F: 3, T: 3, rating: 2, total: 3 },
{ product_id: 25, F: 1, T: 1, rating: 5, total: 1 },
{ product_id: 25, F: 2, T: 2, rating: 4, total: 2 }
推荐需要分别计算真假,但不应单独计算评级。我写的方式是计算每个评级的所有推荐(正确和错误)。
您有两个单独的查询:一个用于 true/false,一个用于评级。
您可以使用连接语句将两者结合起来。连接中的查询将计算 true/false,然后将结果与评级查询组合:
select product_id, rating, count(*), t, f
from reviews
join (
select
sum(if(recommend='true', 1, 0)) as t,
sum(if(recommend='false', 1, 0)) as f
from reviews
where product_id=?
) as q
where product_id=?
group by product_id, rating, t, f
参见db-fiddle。
如果您使用支持 window 函数的 MySQL 8+,您可以尝试使用 SUM() OVER ()
函数作为基本查询,然后将其作为子查询来执行COUNT()
和分组。像这样:
SELECT product_id, rating,
COUNT(product_id) AS total,
recommendTrue,
recommendFalse
FROM
(SELECT product_id, rating,
SUM(recommend='true') OVER () AS recommendTrue,
SUM(recommend='false') OVER () AS recommendFalse
FROM reviews r
WHERE r.product_id = '25') A
GROUP BY product_id, rating, recommendTrue, recommendFalse