gpt4 book ai didi

php - Mysql join 或 php in_array() 哪个更适合优化 Mysql 查询?

转载 作者:行者123 更新时间:2023-11-30 23:15:01 26 4
gpt4 key购买 nike

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

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

所以这里我有以下表格

关注列表

元素编号(整数)
用户名
添加日期(到观察列表)

项目
元素编号(整数)
元素名称
元素描述
添加日期
用户
用户名
名字
我的名字
加入日期

目前用户访问items页面时有多个mysql查询
1 个用户检查查询(如果已登录,则在页面顶部获取用户名)
1 个显示文章的查询(使用类别过滤器)
许多查询以显示某项是否在监视列表中。
我在循环中使用一个查询,该循环检查 watchlist 表中的 usernameitem-id 对,并获取 item-id 与目前的文章并确定它是否在监视列表中(我知道这是一个不好的方法......但我作为初学者使用它作为开始)
如果每页显示 20 个项目,则将有 20 个查询,如果 30 个项目,则有 30 个查询,依此类推......所以我才开始想办法优化它。

一种我想实现的方法是通过对数组的一次查询来获取 watch-list 表中的所有 item-id并在将项目打印到页面并正确打印之前使用 php in_array() 检查

我认为这目前效果很好。但作为初学者,我想学习优化查询的最佳实践
这样做好吗,或者你们中的一些人可以推荐其他技术吗?

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

提前致谢
鼠兔

最佳答案

你的想法是对的,使用join会更好,这样可以省去每一项的额外查询。

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

关于php - Mysql join 或 php in_array() 哪个更适合优化 Mysql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18311468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com