正确的选择/加入“已登录用户喜欢”

时间:2012-09-04 19:03:04

标签: mysql

我们有以下表格:

User (id, name)
Item (id, title, text)
Like (id, itemId, userId)

Like表存储Item和User之间的has-and-Attribute-to-many关系。

从Item中选择列表并查看“登录”用户是否“喜欢”该特定项目的最有效方法是什么?

SELECT * FROM Item ORDER BY published DESC LIMIT 10
(+ check if each Item has been liked by known user id, e.g. '123')

这是通过子选择,加入还是两个单独的查询来完成的?

2 个答案:

答案 0 :(得分:0)

加入比subselect更有效,数据库引擎已经针对连接表进行了很好的优化。

查询(我已更改表'like'的名称,因为它是SQL中的关键字)

SELECT COUNT(*)
FROM User u 
JOIN Likes l ON u.id = l.userID
JOIN Item i ON l.itemid = i.id
WHERE i.title = 'item' AND u.name = 'user'

如果结果大于0,则用户喜欢该项目。

编辑: 如果要显示10个最新项目,并查看用户是否喜欢它们,您可以使用此查询:

SELECT i.id, i.title, IF(l.userID IS NULL, 0, 1) AS Liked
FROM item i 
LEFT JOIN Likes l ON i.id = l.itemID AND l.userID = ?
ORDER BY i.published DESC LIMIT 10

使用LEFT JOIN非常重要,否则您将无法获得用户不喜欢的行。

答案 1 :(得分:0)

最直接的方式(如果我理解正确的问题)是

select * from Like where itemId = ? and userId = ?;

假设您要从会话中检查itemId和userId。 在表Like和列itemId上有一个复合索引,userId可以快速返回查询。