Итак, у меня есть запрос, который получит всю информацию о совпадающих строках, где элементы не видны.
Теперь внутри цикла while я должен был использовать запрос select count, чтобы подсчитать, сколько невидимых элементов есть у каждого пользователя, и это занимает слишком много времени, если в цикле так много результатов.
Есть ли способ выполнить запрос без выполнения запроса select внутри цикла while?
Например:
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)
}