#mysql #sql #count
#mysql #sql #количество
Вопрос:
У меня есть следующая таблица под названием Stores:
Name | Country | Category
Pharmacy Japan Health
Green Vine Italy Dining
Red Palace Morocco Dining
La Pizza Italy Dining
Nature Shop Japan Health
Medical 100 Japan Health
Я хочу написать запрос, который выводит все имена, которые принадлежат к категории, в которой все страны одинаковы (например, все магазины в категории Health находятся в Японии). Например. вывод был бы:
Name | Country | Category
Pharmacy Japan Health
Nature Shop Japan Health
Medical 100 Japan Health
Я знаю, как подсчитать количество записей в категории, но как я могу определить, все ли страны в категории одинаковы? Приветствуется любая информация.
Ответ №1:
Вы можете использовать EXISTS
:
SELECT t.*
FROM table t
WHERE EXISTS (SELECT 1
FROM table t1
WHERE t1.Country = t.Country AND
t1.category = t.category AND
t1.Name <> t.Name
);
Комментарии:
1. Что означает ВЫБРАТЬ 1?
2. Они просто помечают экземпляры, которые соответствуют критериям, поскольку все, что им нужно проверить, — это существование.
3. @ceno980 . . .
SELECT 1
означает существование строки.4. Сработало бы это решение, если бы мне пришлось объединить две таблицы, чтобы получить таблицу ‘Store’? Я не уверен, как я могу использовать этот метод, если мне нужно объединить две таблицы с именами Shop и Info, а затем получить все имена. Например. У меня есть следующий код: select Shop.Name , Страна, Категория из магазина, Информация, где (Shop.Name=Info.Name ). Добавление ‘where exists’ после объединения двух таблиц не работает.
5. Как работает ‘where exists’, чтобы он знал, что все страны, которые принадлежат к категории, одинаковы?
Ответ №2:
Вы можете использовать следующий запрос, чтобы получить все такие категории, для которых все страны одинаковы:
Select t.category
From table t
Group by t.category
Having count(distinct country)=1
Затем вы можете использовать это для получения имен хранилищ:
Select t.name
From table t
Where t.category in
( Select t.category
From table t
Group by t.category
Having count(distinct country)=1)
Этот синтаксис совместим с MS sql server, но я надеюсь, что логику можно перевести на mysql.
Комментарии:
1. Если я хочу получить все категории, для которых все страны одинаковы и являются конкретной страной (например, получить все категории, где все страны ‘Марокко’), как я мог бы это сделать? Будет ли работать изменение кода таким образом, чтобы последняя строка была: «Имея count(distinct country)=1 и country =’Morocco’)?
2. Для этого вы можете использовать предложение
Max(country)=Min(Country) and Max(country)='Morocco'
вместоhaving
.
Ответ №3:
Вы можете использовать агрегирование с HAVING
предложением, которое проверяет, что минимальная страна совпадает с максимальной страной для категории, т. Е. все страны одинаковы (если не может быть NULL
s, что, похоже, имеет место). Затем внутреннее объединение этих категорий.
SELECT *
FROM elbat t1
INNER JOIN (SELECT t2.category
FROM elbat t2
GROUP BY t2.category
HAVING max(t2.country) = min(t2.country)) x
ON x.category = t1.category;
Комментарии:
1. Что такое ‘x’ в приведенном выше запросе?
2. @ceno980: псевдоним для производной таблицы.