#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 в своем ответе.