SQL: Вывести все имена, которые принадлежат к категории, в которой все страны в ней одинаковы

#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: псевдоним для производной таблицы.