Объедините запросы SQL для простоты и повышения производительности

0

Я пытаюсь объединить несколько SQL-запросов, чтобы уменьшить количество выполненных запросов и, надеюсь, увеличить производительность в одно и то же время.

У меня есть много продуктов, разделенных на категории. В некоторых продуктах есть статьи, написанные для них (в большинстве случаев это не так). На данный момент я привожу все продукты для категории, немного похожие на это...

// * used here to keep things simple
SELECT * FROM products WHERE iCategory=23;

Затем для каждого продукта в результирующем списке я делаю дополнительный запрос вроде этого...

SELECT COUNT(*) FROM articlelinks WHERE iProduct=xxx;

Если для продукта есть одна или несколько статей, я могу поместить рядом с ним немного значка.

Могу ли я объединить их в один запрос, который даст мне счет для каждого продукта, , включая продукты, где счетчик будет равен нулю. Все мои попытки приводят к списку, в который входят только продукты со статьей.

Я использую MySql и PHP.

Теги:
performance

3 ответа

1
Лучший ответ

Вы можете использовать (скалярный) подзапрос, чтобы получить счет для каждой "группы".

SELECT
  *,
  (
    SELECT
      COUNT(*)
    FROM
      articlelinks
    WHERE
      articlelinks.iProduct=products.iProduct
  ) as c
FROM
  products
WHERE
  iCategory=23
  • 0
    У меня есть несколько правильных ответов здесь, так что спасибо всем. Я принимаю это, так как это решение легче вписывается в существующий код, хотя остальные так же правильны.
  • 0
    (Как всегда) лучше проверьте ваш запрос с помощью EXPLAIN SELECT .... чтобы увидеть, есть ли у вас правильные индексы для этого запроса. dev.mysql.com/doc/refman/5.0/en/using-explain.html
3

Вы можете попробовать что-то вроде этого

SELECT iProduct, COUNT(articlelinks.iArticle)
FROM products LEFT JOIN
  articlelinks ON products.iProduct = articlelinks.iProduct
WHERE iCategory=23
GROUP BY iProduct
  • 0
    Кажется, я получаю сообщение об ошибке в части запроса COUNT(articlelinks.*) .
  • 0
    Смотрите еще раз, я изменил его на articlelink.iArticle, идентификатор из вашей таблицы articlelink
Показать ещё 1 комментарий
1

Вы можете использовать оператор select следующим образом:

Select iProduct,  
[other cols],    
(select count(*) from articlelinks where iProduct = products.iProduct) as articles  
from products   
WHERE iCategory=23;

Это всегда должно давать вам количество статей, даже если оно равно нулю

Ещё вопросы

Сообщество Overcoder
Наверх
Меню