MySQL JOIN两个表和过滤器。

时间:2018-01-30 18:27:08

标签: mysql join

我在MySQL数据库中有两个表关注表。

  

餐馆

     

喜欢

用户可以喜欢一个或多个餐馆,user_id和restaurant_id存储在Likes表中以引用这两个表。所以你可以想象,我有一个1到M的模型。

现在我想要返回所有餐馆及其类似信息而不重复。如果当前用户不喜欢餐厅,则仍应退回餐厅。所以我想使用LEFT JOIN,但我仍然遇到如下所述的问题。

我尝试的查询如下。

SELECT restaurants. * , likes.resid, likes.userid
   FROM restaurants
   LEFT JOIN likes ON restaurants.id = likes.resid WHERE likes.userid is NULL OR likes.userid = 'current_user';

SELECT restaurants. * , likes.resid, likes.userid
   FROM restaurants
   LEFT JOIN likes ON restaurants.id = likes.resid;

上述查询的问题是,第一个返回当前用户喜欢的餐馆,忽略其他人喜欢的餐馆,而第二个返回重复的餐馆。

3 个答案:

答案 0 :(得分:1)

您需要将过滤器与左连接一起放置:

SELECT restaurants. * , likes.resid, likes.userid
FROM restaurant
LEFT JOIN likes ON restaurants.id = likes.resid AND likes.userid = 'current_user'

当您将过滤器放入WHERE子句中的第二个表(喜欢表)时,过滤器将应用于整个结果集。这变得像常规联接,因为所有其他餐馆likes.userid都不是= 'current_user',而且会过滤掉。

要解决此问题,请在连接上添加过滤器,而不是Where子句。

答案 1 :(得分:0)

为什么不只是一个简单的LEFT JOIN

SELECT restaurants. * , likes.resid, likes.userid
FROM restaurants
LEFT JOIN likes ON restaurants.id = likes.resid

答案 2 :(得分:0)

我认为您可以使用GROUP BY来避免重复的值。