【问题标题】:SQL: Output all names which belong to a category where all the countries within it are the sameSQL:输出属于一个类别的所有名称,其中所有国家都相同
【发布时间】:2019-03-29 14:35:23
【问题描述】:

我有一个名为 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

我想编写一个查询,输出属于所有国家都相同的类别的所有名称(例如,健康类别中的所有商店都在日本)。例如。输出将是:

Name       |  Country  |  Category
Pharmacy      Japan       Health
Nature Shop   Japan       Health
Medical 100   Japan       Health

我知道如何计算每个类别的条目数,但我如何判断一个类别中的所有国家/地区是否相同?任何见解都值得赞赏。

【问题讨论】:

    标签: mysql sql count


    【解决方案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
                 );
    

    【讨论】:

    • SELECT 1 是什么意思?
    • 它们只是标记符合条件的实例,因为它们只需要检查是否存在。
    • @ceno980。 . . SELECT 1 表示存在一行。
    • 如果我必须加入两个表来获取表“Store”,这个解决方案会起作用吗?如果我必须加入两个名为 Shop 和 Info 的表,然后获取所有名称,我不确定如何使用此方法。例如。我有以下代码:选择 Shop.Name、Country、Shop 中的 Category、Info where (Shop.Name=Info.Name)。在我加入两个表后添加“存在的地方”不起作用。
    • “存在的地方”如何工作,以便知道属于某个类别的所有国家/地区都是相同的?
    【解决方案2】:

    您可以使用以下查询来获取所有国家/地区相同的所有此类类别:

        Select t.category
        From table t
        Group by t.category
        Having count(distinct country)=1
    

    然后你可以使用它来获取 StoreNames:

        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。

    【讨论】:

    • 如果我想获取所有国家都相同并且是特定国家的所有类别(例如,获取所有国家都是“摩洛哥”的所有类别),我该怎么做?将修改代码以使最后一行是:'Having count(distinct country)=1 and country='Morocco') 有效吗?
    • 为此,您可以使用Max(country)=Min(Country) and Max(country)='Morocco' 而不是having 子句。
    【解决方案3】:

    您可以将聚合与 HAVING 子句一起使用,该子句检查最小国家/地区是否与类别的最大国家/地区相同,即所有国家/地区都相同(如果不能有 NULLs,这似乎是这样)。然后内联这些类别。

    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;
    

    【讨论】:

    • 上述查询中的“x”是什么?
    • @ceno980:派生表的别名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多