【发布时间】:2019-11-06 16:50:10
【问题描述】:
所以我有一个查询,它将获取有关项目不可见的匹配行的所有信息。
现在在 while 循环中,我不得不使用 select count 查询来计算每个用户有多少不可见的项目,如果循环中有这么多结果,这将花费太多时间。
有没有办法在while循环中不运行select查询来查询它?
例如:
SELECT categories.name,
quality.name,
users.regdate,
categories.name,
items.name,
items.visible,
items.owner,
users.username
FROM items
LEFT JOIN users ON items.owner = users.id
LEFT JOIN categories ON items.category = categories.id
LEFT JOIN quality on items.category_quality = quality.id
WHERE items.visible = 'no'
现在在 while 循环中获取项目数,我必须查询
while($row = mysqli_fetch_assoc($sql))
{
$all_items_by_user = "SELECT COUNT(items.name)
FROM items
WHERE items.owner = ".$row['owner']."";
$visible_items_by_user = "SELECT COUNT(items.name)
FROM items
WHERE items.owner = ".$row['owner']." AND items.visible = 'yes'";
// rest of code here.
// when there are 200 items in loop executing time goes crazy
// (6+ secs, where with 1 item it's around 0.05)
}
用示例编辑:
有些人想看看最终的代码是什么,我会尽力做到最好。
忽略左连接,因为这不是相关的,我只是从整个查询中添加了这些。
Id | item name | owner | Visible
1 | Item 1 | 2 | no
2 | Item 2 | 2 | yes
3 | Item 3 | 2 | no
4 | Item 4 | 2 | no
5 | Item 5 | 2 | no
6 | Item 6 | 3 | no
7 | Item 7 | 3 | no
8 | Item 8 | 3 | no
9 | Item 9 | 4 | no
10 | Item 10 | 4 | no
在每个用户的 while 循环中,它应该计算用户拥有的行数。
例如: 用户 2 共有 5 行,隐藏 4 行,($all_items_by_user 将计算所有内容,而 $visible_items_by_user 将仅计算 1) 用户 3 拥有 3 行, 用户 4 拥有 2 行。
如何计算每个用户的项目,因为如果我在 while 循环之外进行,它将只计算第一个用户,而不是每个用户。
最终结果应该是
while($row = mysqli_fetch_assoc($sql))
{
$all_items_by_user = "SELECT COUNT(items.name)
FROM items
WHERE items.owner = ".$row['owner']."";
$visible_items_by_user = "SELECT COUNT(items.name)
FROM items
WHERE items.owner = ".$row['owner']." AND items.visible = 'yes'";
echo $row['owner'] . "(Visible items: number | All items: number";
// Output: 2 (Visible items: 1 | All items: 5)
}
【问题讨论】:
-
一个好的经验法则是永远不要在循环内执行查询!
-
是的,我知道,但我看不出如何获取用户 ID 并在循环外执行它。如果我在外面做并设置用户 ID,它只会返回 1 个用户结果。但是有很多用户有不可见的项目。
-
因此,您正在获取项目列表,然后为拥有每个项目的用户获取其他可见项目的总数。这意味着如果每个所有者隐藏了 10 个项目,您将每次计算未隐藏的项目。