这个问题在这里已经有答案了:
如何在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
. 有什么办法吗?我尝试了许多不同的连接,但都没有得到我想要的结果。
请看下面的图片,显示我得到的电流输出:
2条答案
按热度按时间kmb7vmvb1#
尝试将分组子句更改为:
z9ju0rcb2#
我很确定你的问题在于你是按
products.department_id
而不是departments.department_id
. 如果一个部门没有产品,那么左连接将(在分组之前)为该部门生成一个包含所有产品的结果行products.*
列设置为空。如果按这些列中的一列(甚至是部门id)分组,则分组结果将把没有产品的所有部门合并在一起,因为products.department_id
将为空。下面是一个简单的例子来说明这一点:
如果运行此查询,结果应如下所示:
呃,等等。。。你怎么了
foo_id
50? 在分组之前,左连接产生了如下结果:注意这里有两排
bar.foo_id
为空。如果然后对该列上的结果进行分组,则这些行将被分组在一起,即使它们的值不同foo.foo_id
.而更严格的rdbms可能会抱怨您选择的是非分组列
foo.foo_id
而不是将其 Package 在聚合函数中,如COUNT()
或者SUM()
,mysql在默认情况下没有那么严格,只会从每个组中为该列选择一个任意值。在上面的例子中,我得到了40,但也可以是50。无论如何,解决方法很简单:只需将分组列更改为
departments.department_id
你会得到你期望的结果。或者,为了继续使用我的示例模式,我可以将上面查询中的分组列从bar.foo_id
至foo.foo_id
并得到以下结果: