mysql join或php in_array()哪个更好地优化Mysql查询?

时间:2013-08-19 10:23:25

标签: php mysql

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

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

所以我在这里有以下表格

观看列表表格

项-ID(INT)
用户名
添加日期(观看清单)

项目表格 项目-ID(INT)
项目名称
单品介绍
最新添加
用户
用户名
FNAME
LNAME
joinDate

目前,当用户访问项目页面时,有多个mysql查询 1用户检查查询(如果登录,则在页面顶部获取用户名)
1个用于显示文章的查询(使用类别过滤器)
许多查询以显示项目是否在观察列表中 我在循环中使用查询,检查监视列表表中的用户名 item-id 对,并抓取item-id将其与现在的文章,并决定它是否在观察名单中(我知道这是一个糟糕的方式......但我用它作为一个开始,因为我是一个初学者)
如果每页显示20个项目,那么如果有30个项目30个查询,则将有20个查询等等......所以我才开始找出优化它的方法。

我想要实现的一种方式是使用一个查询对数组中的监视列表表中的所有 item-id 并在将项目打印到页面并正确打印之前使用php in_array()进行检查
我认为现在这种方法很好。但是因为我是初学者,所以我想学习优化查询的最佳实践这是好事还是有些人可以提出其他技巧。

你们中的一些人可能会建议使用连接.......但我不知道如何在这种情况下使用它们。如果它是一种更好的方式....有人可以解释我如何在这个中使用连接方案

提前致谢
Shrikanth

1 个答案:

答案 0 :(得分:0)

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

您现在必须做的事情:使用left 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}