如果用户子集中的任何一个为特定项目提供特定评级,如何从mySQL选择中排除项目?

时间:2016-05-08 09:50:00

标签: mysql

我正在开发一个小型网络应用程序,您可以对餐馆进行评级或评估您想要尝试的数量。我的数据库设置如下:

users (name, userid)


ratings(userid,restaurantid,rating(#0-5),visited(boolean))

(如果您之前没有去过一家餐馆,但给它一个0-5的评级,系统会将其视为您喜欢它的程度)

我希望能够将您的评分/愿望清单与其他用户进行比较,但我遇到了一些问题。我知道如何加入表格并获得比较中每个用户的评级总和,以便评级最高的餐馆通过使用它来浮动到顶部:

SELECT ratings.rest_id, SUM( ratings.rating ) AS Sum
FROM names
LEFT JOIN ratings ON ratings.rest_id = names.id
WHERE ratings.user_id IN ( userid1, userid2, userid3 ) 
GROUP BY ratings.rest_id
ORDER BY  `Sum` DESC , names.name ASC  

但是我希望用户能够修改搜索,因此它只包含所有包含的用户都设置为“已访问”的餐馆(因此您可以看到所有这些用户的最喜欢的餐馆,所有这些都是实际上已经去过了,或者“未经访问过”(所以你可以提出一个没有人去过的地方的清单,但每个人都想尝试最多)。

如果我只是在WHERE的末尾添加“AND ratings.visited!= 1”子句,它将排除将访问列设置为1(已访问)的特定用户的评级,但它仍将包括另一个用户对该餐厅的评级(我不想要)。例如,如果您有以下设置:

User | Restaurant | rating | visited
------------------------------------
pam  |   subway   |   5    |    1
joe  |   subway   |   3    |    0
bob  |   subway   |   1    |    0

pam  |   bigboy   |   4    |    0
joe  |   bigboy   |   3    |    0
bob  |   bigboy   |   4    |    0

pam  |  tacobell  |   2    |    1
joe  |  tacobell  |   2    |    1
bob  |  tacobell  |   5    |    1

目前通过添加“AND ratings.visited!= 1”子句并运行上述搜索,结果将是:

rest_id | Sum
-------------
subway  |  4
bigboy  | 11

尽管Pam已经访问了地铁,但仍然包括地铁(仅限她的评级)。当我想要的是搜索只返回bigboy的总和,因为这是所有包含的访客从未去过的唯一的餐厅。

任何人都能指出我正确的方向吗?

谢谢! 杰里米

1 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS()

解决此问题
SELECT ratings.rest_id, SUM( ratings.rating ) AS Sum
FROM names
LEFT JOIN ratings ON ratings.rest_id = names.id
 AND ratings.user_id IN ( userid1, userid2, userid3 ) 
WHERE NOT EXISTS(SELECT 1 FROM ratings r 
                 WHERE r.visited = 1 AND r.rest_id = ratings.rest_id)
GROUP BY ratings.rest_id
ORDER BY  `Sum` DESC , names.name ASC

另外,正如您所看到的,我已将ratings.user_id IN ( userid1, userid2, userid3 )条件移至ON子句。当离开加入时,右表上的条件应该在ON中,当在WHERE子句中指定时,左连接自动变成内连接。