1

我正在尝试为我当前的项目实现监视列表功能,用户可以在其中将项目添加到他们的监视列表中。

因此,直到将项目添加到监视列表工作正常,但是当显示特定类别中的所有项目(在监视列表中而不是集中在监视列表中)时,我需要检查用户监视列表中的项目是否以及它是否不在监视列表我必须显示一个添加到监视列表的按钮.....如果它已经在监视列表中,请使用一个按钮将其删除。

所以在这里我有以下表格

观察名单

item-id(int)
用户名
​​ 添加日期(到观察列表)

items
item-id(int)
item-name
item-description
添加日期
users
username
fname
lname
joinDate

目前当一个用户访问项目页面时,有多个 mysql 查询
1 个用于用户检查的查询(如果已登录,则在页面顶部获取用户名)
1 个用于显示文章的查询(使用类别过滤器)
许多查询用于显示一个项目是否是在观察名单中。
我在一个循环中使用一个查询,它从监视列表中检查用户名项目 ID对,并获取项目 ID 将其与当前文章进行比较并决定它是否在监视列表中(我知道这是一个坏方法......但我用它作为开始,因为我是一个初学者) 如果每页显示 20 个项目,如果 30 个项目 30 个查询等等,则将有 20 个查询......所以我刚刚开始想办法优化它。


我正在考虑实现的一种方法是通过一个查询来获取监视列表表中的所有项目ID,并在将项目打印到页面并正确打印之前使用 php in_array()检查我认为这可行现在很好。但是由于我是初学者,我想学习优化查询的最佳实践,这很好吗,或者你们中的一些人可以建议其他技术。 你们中的一些人可能会建议使用连接.......但我不知道如何在这种情况下使用它们。如果这是一种更好的方法......有人可以解释我如何在此使用连接设想




在此先
感谢施里坎特

4

1 回答 1

0

您的想法是正确的,最好使用连接,因为这可能会为您节省每个项目的额外查询。

您现在必须做的:使用 aleft join来确定该条目是否被列入观察名单。(如果不是,则连接的右手结果将为空。

它看起来像这样(未经测试):

选择当前用户的所有关注列表项。

SELECT 
 i.* 
FROM
 items i
LEFT JOIN
 watch-list wl
ON
  i.item-id = wl.item-id AND
  wl.user-id = {$currentUserId}
WHERE
  NOT isnull(wl.item-id) --if theres a right side, its watchlisted

反之亦然,选择所有未列入观察名单

SELECT 
 i.* 
FROM
 items i
LEFT JOIN
 watch-list wl
ON
  i.item-id = wl.item-id AND
  wl.user-id = {$currentUserId}
WHERE
  isnull(wl.item-id) 

选择所有项目并插入一个标志以确定该项目是否被列入观察名单。

SELECT 
 i.*,
 IFNULL(wl.item-id, "0") as watchlisted -- will be > 0 if watchlisted.  
FROM
 items i
LEFT JOIN
 watch-list wl
ON
  i.item-id = wl.item-id AND
  wl.user-id = {$currentUserId}
于 2013-08-19T10:31:33.217 回答