Я пытаюсь объединить несколько SQL-запросов, чтобы уменьшить количество выполненных запросов и, надеюсь, увеличить производительность в одно и то же время.
У меня есть много продуктов, разделенных на категории. В некоторых продуктах есть статьи, написанные для них (в большинстве случаев это не так). На данный момент я привожу все продукты для категории, немного похожие на это...
// * used here to keep things simple
SELECT * FROM products WHERE iCategory=23;
Затем для каждого продукта в результирующем списке я делаю дополнительный запрос вроде этого...
SELECT COUNT(*) FROM articlelinks WHERE iProduct=xxx;
Если для продукта есть одна или несколько статей, я могу поместить рядом с ним немного значка.
Могу ли я объединить их в один запрос, который даст мне счет для каждого продукта, , включая продукты, где счетчик будет равен нулю. Все мои попытки приводят к списку, в который входят только продукты со статьей.
Я использую MySql и PHP.
Вы можете использовать (скалярный) подзапрос, чтобы получить счет для каждой "группы".
SELECT
*,
(
SELECT
COUNT(*)
FROM
articlelinks
WHERE
articlelinks.iProduct=products.iProduct
) as c
FROM
products
WHERE
iCategory=23
Вы можете попробовать что-то вроде этого
SELECT iProduct, COUNT(articlelinks.iArticle)
FROM products LEFT JOIN
articlelinks ON products.iProduct = articlelinks.iProduct
WHERE iCategory=23
GROUP BY iProduct
COUNT(articlelinks.*)
.
Вы можете использовать оператор select следующим образом:
Select iProduct,
[other cols],
(select count(*) from articlelinks where iProduct = products.iProduct) as articles
from products
WHERE iCategory=23;
Это всегда должно давать вам количество статей, даже если оно равно нулю
EXPLAIN SELECT ....
чтобы увидеть, есть ли у вас правильные индексы для этого запроса. dev.mysql.com/doc/refman/5.0/en/using-explain.html