我在MySQL数据库中有一个名为sales的表,如下所示:

company     manufactured    shipped
Mercedes    Germany         United States
Mercedes    Germany         Germany
Mercedes    Germany         United States
Toyota      Japan           Canada
Toyota      Japan           England
Audi        Germany         United States
Audi        Germany         France
Audi        Germany         Canada
Tesla       United States   Mexico
Tesla       United States   Canada
Tesla       United States   United States

这是一把小提琴:http://www.sqlfiddle.com/#!17/145ff/3

我想返回将ALL个产品发货到国际的公司列表(即,其中manufactured列中的值不同于shipped列中ALL records个特定company的值).

使用上面的示例,所需的结果集将为:

company
Toyota
Audi

以下是我的(黑客)try :

WITH temp_table AS (

                SELECT
                  s.company                                          AS company
                  , SUM(CASE
                           WHEN s.manufactured != s.shipped THEN 1
                           ELSE 0
                        END
                       )                                             AS count_international
                  , COUNT(s.company)                                 AS total_within_company

                FROM
                  sales s

                GROUP BY
                  s.company

              )

                SELECT
                   company
                FROM
                   temp_table
                WHERE count_international = total_within_company

从本质上讲,我计算列不匹配的实例.然后,我判断这些不匹配实例的总和是否与给定组中的记录数量匹配.

这种方法是works,但它远不是一个优雅的解决方案!

有没有人能就实现该查询的一种更惯用的方式提供建议?

谢谢!

推荐答案

我们可以GROUP BY个公司,用一个HAVING条款来说shipped个国家必须不同于manufactured个国家:

SELECT company
FROM sales
GROUP BY company
HAVING COUNT(CASE WHEN manufactured = shipped THEN 1 END) = 0;

在这里试试:db<>fiddle

问题中链接的小提琴是Postgres DB,但MySQL被称为DBMS.

在MySQL数据库中,上述查询可以简化为:

SELECT company
FROM sales
GROUP BY company
HAVING SUM(manufactured = shipped) = 0;

在Postgres数据库中,这是不可能的.

Mysql相关问答推荐

在mySQL中使用子查询和WHERE子句的JOIN

mysql使用LIKE查找二进制字段有问题

为什么我的带有索引字段和非索引字段的 Select 有时需要很长时间

不分组寻呼

使用不同的 where 列进行子 Select

获取 TEXT 类型行的百分比

处理 Visits 表中数百万行的最佳方法是什么?

MariaDB 下的慢速更新、删除和插入查询

在 MySQL 的存储过程中调用存储过程

如何查看打开了多少 MySQL 连接?

如何通过一个查询批量更新 mysql 数据?

MySQL - 表'my_table'没有被锁定表锁定

MySQL 中的 VARCHAR(255) 和 TINYTEXT 字符串类型有什么区别?

如何从两个不同的日期获得年份差异?

MySQL与空值比较

在 MySQL 中签名或未签名

MySQL获取两个值之间的随机值

int(11) 和 int(11) UNSIGNED 有什么区别?

MySQL在哪里存储数据库文件?

来自 MySQL 中多个表的 COUNT(*)