我正在练习MySQL,并且正在尝试解决练习。我的数据包含某家酒店的评论。数据包含不同用户的评论:如果一个用户访问了不止一次,则可以有很多评论。每个评论都有自己的id
,然后评论值从1到5。
评论也有日期,现在,我想计算第一次访问的平均评论(最早的日期)。我的问题是,我尝试检索最早日期的方法实际上不起作用。我的意思是,无论是否使用HAVING
和WHERE
方法,我都会得到相同的结果。有没有人可以帮助我呢?谢谢!
这是我的查询(我尝试使用HAVING
和WHERE
方法)
SELECT AVG(overall_rating), AVG(rooms_rating), AVG(service_rating), AVG(location_rating), AVG(value_rating)
FROM reviews
HAVING MIN(review_date)
#WHERE review_date IN (SELECT MIN(review_date) FROM repatrons_reviews GROUP BY id)
以下是数据示例
user_id | id | rooms_rating | service_rating | location_rating | value_rating | date
---------------------------------------------------------------------------------------
matt21 | 123 | 4 | 5 | 2 | 4 | 2007-08-20
答案 0 :(得分:1)
您可以使用“不存在”来做到这一点:
SELECT AVG(r.overall_rating), AVG(r.rooms_rating), AVG(r.service_rating), AVG(r.location_rating), AVG(r.value_rating)
FROM reviews r
WHERE NOT EXISTS (SELECT 1 FROM reviews WHERE user_id = r.user_id AND date < r.date)
答案 1 :(得分:1)
此
SELECT ...
FROM reviews
HAVING MIN(review_date)
无法工作。假设表格中的最小日期为DATE '2020-01-01'
,那么HAVING DATE '2020-01-01'
应该是什么意思?
此
SELECT ...
FROM reviews
WHERE review_date IN (SELECT MIN(review_date) FROM reviews GROUP BY id);
已经结束,但这不是每个ID的最小日期,而是您想要的每个用户ID的最小日期。而且,如果将id
替换为user_id
,那么仍然存在问题,因为一个用户的第一个日期是另一个用户的第三个日期。
此查询已更正:
SELECT
AVG(overall_rating), AVG(rooms_rating),
AVG(service_rating), AVG(location_rating), AVG(value_rating)
FROM reviews
WHERE (user_id, review_date) IN
(SELECT user_id, MIN(review_date) FROM reviews GROUP BY user_id);