我们有以下表格:
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')
这是通过子选择,加入还是两个单独的查询来完成的?
答案 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可以快速返回查询。