ПОДСЧЕТ строк таблицы mysql на основе 2 условий из другой таблицы

#php #mysql

#php #mysql

Вопрос:

У меня есть две таблицы table1 и table2 . table1 имеет столбцы id и table2_id while table2 имеет id и category . Мне нужно подсчитать строки из table1 на основе двух отдельных значений в table2.category содержащем значение Regular или Special .

Я сделал это в двух запросах, но я хочу знать, возможно ли это в одном sql. Мои запросы:

 "SELECT COUNT(t1.id) AS regular FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.t2_id = t2.id WHERE t2.category = 'Regular'";
"SELECT COUNT(t1.id) AS special FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.t2_id = pr.id WHERE t2.category = 'Special'";
  

Спасибо.

Редактировать

Второй запрос JOIN должен читать ON t1.t2_id = t2.id , а не ON t1.t2_id = pr.id . Извините за путаницу, которая могла возникнуть. Пожалуйста, обновите / отредактируйте свои ответы / комментарии соответствующим образом.

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

1. Вы используете MySQL или SQL Server? Они не совпадают. Пожалуйста, проверьте свои теги.

2. @AaronBertrand О! Спасибо. Я не могу объяснить, как я мог это пропустить. Я удалил несвязанный тег.

Ответ №1:

Переместите Where условие в CASE оператор и выполните подсчет

Вот один из способов использования Conditional Aggregate

 SELECT
COUNT(case when t2.category = 'Regular' then t1.id end) AS Regular,
COUNT(case when t2.category = 'Special' then t1.id end) AS special 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.t2_id = pr.id 
Where t2.category IN ('Regular','Special' )
  

Примечание: Я изменил LEFT JOIN на INNER JOIN , потому что вы хотите считать только тогда, когда table2.category есть 'Regular' или 'Special' , поэтому здесь LEFT JOIN не используется

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

1. Просто глядя на ваше решение, кажется, что это правильный метод, одна строка для обоих значений. Я вернусь, чтобы согласиться сразу же, как только попробую это.

Ответ №2:

Вместо

 "SELECT COUNT(t1.id) AS regular FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.t2_id = t2.id WHERE t2.category = 'Regular'";
"SELECT COUNT(t1.id) AS special FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.t2_id = pr.id WHERE t2.category = 'Special'";
  

вы можете сделать это:

 select t2.category, count(t1.id)
from table1 t1
left outer join table2
on t1.t2_id = t2.id
group by t2.category
having t2.category in ('Regular', 'Special')
  

Предлагаемый запрос группирует объединенные записи, фильтрует группы и выбирает название категории и ее количество.

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

1. Итак, как мне извлечь подсчитанные значения? Я предполагаю, что это решение приведет к двум отдельным строкам.

2. @StephenAdelakun, да, это приводит к двум отдельным строкам. В вопросе не была указана необходимость в одной строке, но вы можете использовать case when для этой цели, как это сделал Prdp в своем ответе.