Оптимизация группирования подзапросов MySQL

#mysql #optimization #subquery

#mysql #оптимизация #Подзапрос

Вопрос:

У меня есть таблица категорий и таблица продуктов. Продукты имеют category_id, а также maker_id .

Я пытаюсь вернуть таблицу имен категорий вместе с двоичным файлом о том, содержит ли категория какие-либо продукты, которые принадлежат данному $maker_id (как определено в коде PHP).

Мой текущий метод подсчитывает, сколько подходящих продуктов находится в каждой категории, но я предполагаю, что есть более быстрый способ, поскольку мне нужно только Да / Нет. Текущий код:

 SELECT 
    c.name,
    SUM(CASE WHEN p.maker_id = '{$maker_id}' THEN 1 ELSE 0 END) AS already_used
FROM categories c
LEFT JOIN products p ON p.category_id = c.id
GROUP BY c.id
  

Я читаю об использовании EXISTS, но все примеры, которые я нашел, используют его в предложении WHERE . Спасибо!

Комментарии:

1. Нужна ли вам какая-либо другая информация о продуктах, кроме from maker_id ?

2. Да. Я делаю еще один аналогичный подсчет того, сколько из них находится в разных «статусах». В основном: СУММА (СЛУЧАЙ, КОГДА p.status = ‘ready’, ЗАТЕМ 1 ЕЩЕ 0 КОНЕЦ) как ready_count . Если есть способ объединить эти типы группирующих запросов, это было бы здорово.

Ответ №1:

Вы можете попробовать это:

 SELECT c.name,COUNT(1) AS already_used, SUM(IF(p.status = 'ready', 1, 0)) AS ready_count 
FROM categories c 
LEFT JOIN products p 
ON  (p.category_id = c.id)
WHERE  p.maker_id = '{$maker_id}'
GROUP BY c.id;