SQL查询返回无效结果

时间:2017-05-05 20:43:41

标签: sql sqlite join average

SQL的新手,所以我很欣赏任何关于我在这个SQL语句中出错的提示。

我有两个表,一个名为Hotel,另一个名为Review。它们由HotelID链接。我正在尝试返回与HotelID大于或等于3(OverallRating表中的属性)相关联的Hotel和平均Cleanliness(a Review属性)大于或等于5.

我知道有一个事实是没有 HotelID满足这两个要求,但这个陈述会返回很多结果。

SELECT
    Hotel.HotelID
FROM
    Hotel 
    INNER JOIN Review ON Hotel.HotelID = Review.ReviewID 
GROUP BY
    Hotel.HotelID 
HAVING
    ( Hotel.OverallRating >= 3 )
    AND
    ( AVG( NULLIF( Review.Cleanliness, -1 ) ) >= 5);

NULLIF用于排除-1的值(表示没有评级)。

全部谢谢

4 个答案:

答案 0 :(得分:2)

我认为问题是你INNER JOIN声明。当您将两个表连接在一起时,您希望将它们连接到它们之间相关的数据上。您目前正在加入Hotel.HotelID = Review.ReviewID。我的猜测是这些都是各自表格的主键,而且ReviewID没有指向酒店的记录。

尝试将您的加入更改为ON Hotel.HotelID = Review.HotelID

答案 1 :(得分:2)

你的内心联系是错误的。

INNER JOIN Review ON Hotel.HotelID = Review.ReviewID

应该是

INNER JOIN Review ON Hotel.HotelID = Review.HotelID

在联接中使用HotelId而非ReviewId

答案 2 :(得分:1)

嗯。嗯。 。 。在加入酒店之前总结一下评论。然后,您还应该加入正确的密钥:

SELECT h.HotelID
FROM Hotel h JOIN
     (SELECT r.HotelId, AVG(r.Cleanliness) as avg_cleanliness
      FROM Review r
      GROUP BY r.HotelId
     ) r
     ON h.HotelId = r.HotelId
WHERE h.OverallRating >= 3 AND r.avg_cleanliness >= 5;

答案 3 :(得分:-2)

我也是sql的新手,但你尝试过使用WHERE语句吗?

选择Hotel.HotelID 从酒店 INNER JOIN评论Hotel.HotelID = Review.HotelID WHERE(Hotel.OverallRating> = 3)AND(AVG(NULLIF(Review.Cleanliness,-1))> = 5);

相关问题