我在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;
上述查询的问题是,第一个返回当前用户喜欢的餐馆,忽略其他人喜欢的餐馆,而第二个返回重复的餐馆。
答案 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来避免重复的值。