mysql查询“departments left join products”按department\u id分组,不返回所有部门的数据

zlwx9yxi  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(337)

这个问题在这里已经有答案了

如何在mysql中进行完整的外部连接(15个答案)
两年前关门了。
我有两张table- departments 以及 products . 我正在尝试使用以下查询连接这两个表:

SELECT departments.department_id, departments.department_name, departments.over_head_costs, SUM(products.product_sales) as product_sales, products.product_sales - departments.over_head_costs AS profit
FROM departments
LEFT JOIN products
ON departments.department_id = products.department_id
GROUP BY products.department_id

我遇到的问题是,这个查询只返回一些部门的数据。我想看看所有部门的数据,即使没有产品有这个 department_id . 有什么办法吗?我尝试了许多不同的连接,但都没有得到我想要的结果。
请看下面的图片,显示我得到的电流输出:

kmb7vmvb

kmb7vmvb1#

尝试将分组子句更改为:

GROUP BY departments.department_id
z9ju0rcb

z9ju0rcb2#

我很确定你的问题在于你是按 products.department_id 而不是 departments.department_id . 如果一个部门没有产品,那么左连接将(在分组之前)为该部门生成一个包含所有产品的结果行 products.* 列设置为空。如果按这些列中的一列(甚至是部门id)分组,则分组结果将把没有产品的所有部门合并在一起,因为 products.department_id 将为空。
下面是一个简单的例子来说明这一点:

CREATE TEMPORARY TABLE foo (
  foo_id INTEGER PRIMARY KEY
);
CREATE TEMPORARY TABLE bar (
  bar_id INTEGER PRIMARY KEY,
  foo_id INTEGER NULL
);
INSERT INTO foo (foo_id) VALUES (10), (20), (30), (40), (50);
INSERT INTO bar (bar_id, foo_id) VALUES
  (1, 10), (2, 10), (3, 10),
  (4, 20), (5, 20), (6, 30);

SELECT foo.foo_id, COUNT(bar.bar_id)
  FROM foo
  LEFT JOIN bar USING(foo_id)
  GROUP BY bar.foo_id

如果运行此查询,结果应如下所示:

foo.foo_id  COUNT(bar.bar_id)
40          0
10          3
20          2
30          1

呃,等等。。。你怎么了 foo_id 50? 在分组之前,左连接产生了如下结果:

foo.foo_id  bar.foo_id  bar.bar_id
10          10          1
10          10          2
10          10          3
20          20          4
20          20          5
30          30          6
40          NULL        NULL
50          NULL        NULL

注意这里有两排 bar.foo_id 为空。如果然后对该列上的结果进行分组,则这些行将被分组在一起,即使它们的值不同 foo.foo_id .
而更严格的rdbms可能会抱怨您选择的是非分组列 foo.foo_id 而不是将其 Package 在聚合函数中,如 COUNT() 或者 SUM() ,mysql在默认情况下没有那么严格,只会从每个组中为该列选择一个任意值。在上面的例子中,我得到了40,但也可以是50。
无论如何,解决方法很简单:只需将分组列更改为 departments.department_id 你会得到你期望的结果。或者,为了继续使用我的示例模式,我可以将上面查询中的分组列从 bar.foo_idfoo.foo_id 并得到以下结果:

foo.foo_id  COUNT(bar.bar_id)
10          3
20          2
30          1
40          0
50          0

相关问题