#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;