0

我们有以下表格:

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

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

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

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

这最好通过子选择、连接或两个单独的查询来完成?

4

2 回答 2

0

联接比子选择更有效,数据库引擎针对联接表进行了很好的优化。

查询(我已经更改了表'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 很重要,否则您将无法获得用户不喜欢的行。

于 2012-09-04T19:10:00.973 回答
0

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

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

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

于 2012-09-04T19:11:41.873 回答