1

我有一个餐厅评分和评论数据库,每家餐厅可能有 1 到 1000 条评论。

我首先尝试查找哪些餐厅的评论中包含“taco”这个词的评论最多 4+,然后我使用下面的代码让它工作:

    select id, count(id) from test where (comment like '%taco%') AND rating >= 3 group by id order by count(id) DESC;

因此,例如,如果 X 餐厅有 30 条 4+ 包含“taco”的评分评论,我会为该行获得“X|30”。

我想添加两个附加功能:

  1. 列出每家餐厅的评论总数(无条件)
  2. 对包括“taco”在内的所有餐厅评论进行平均评分。

如果餐厅 X 总共有 150 条评论,其中 30 条评分为 4+,包括“taco”,这 30 条评论的平均评分为 2.5,我会得到:

'X|30|150|2.5|'

我如何得到这个结果?

4

4 回答 4

6

这样的事情可能会奏效。

select id
, count(*) totalreviews
, sum(case when rating >= 3 and comment like '%taco%' then 1 else 0 end) ratings4plus
, avg(case when rating >= 3 and comment like '%taco%' then rating else null end) avgratings4plus
from test
group by id
于 2013-03-11T19:50:50.950 回答
2

这是未经测试的,但你可以尝试类似

select id,
       count(id), 
       sum(case when (comment like '%taco%' and rating >=3) then 1 
                else 0 end) taco_rating, 
       avg(case when comment like '%taco%' then rating else null end ) avg_taco
  from test
 group by id
于 2013-03-11T19:52:06.783 回答
1

使用子查询:

SELECT id,
       (SELECT COUNT(*)
        FROM test
        WHERE id = t1.id
          AND comment LIKE '%taco%'
          AND rating >= 3),
       (SELECT COUNT(*)
        FROM test
        WHERE id = t1.id),
       (SELECT AVG(rating)
        FROM test
        WHERE id = t1.id
          AND comment LIKE '%taco%'
          AND rating >= 3),
FROM (SELECT DISTINCT id
      FROM test) AS t1
于 2013-03-11T19:50:46.983 回答
1

对于4+,您的测试应该是rating > 3而不是rating >= 3,但这会做到:

select
    id,
    sum(case when comment like '%taco%'
            AND rating > 3 then 1 else 0 end) as rating4plus_count,
    count(*) as all_ratings_count,
    avg(case when comment like '%taco%'
            AND rating > 3 then rating else null end) as rating4plus_avg
from test
group by id
order by 1 DESC;

注意简写order by 1,这是按“列号 1”排序的 SQL 标准方式(而不是在 order by 子句中重复列 1 的表达式)

于 2013-03-11T19:55:26.553 回答