Php 如何在mysql中使用内部联接或GROUPBY从两个表中获取所有平衡值?
我有两张桌子 表名称:年份 表名称:月份 预期产出: 我对上述输出使用下面的查询,但得到了意外的结果Php 如何在mysql中使用内部联接或GROUPBY从两个表中获取所有平衡值?,php,mysql,Php,Mysql,我有两张桌子 表名称:年份 表名称:月份 预期产出: 我对上述输出使用下面的查询,但得到了意外的结果 SELECT a.id , SUM(a.no_of_units_purchase) FROM month a , year b WHERE a.id=b.id GROUP by b.id 上述查询的输出: 请引导我得到预期的结果 提前感谢。内部联接(如您所发现的)只返回两个表之间存在匹配的情况。可以使用外部联接返回一个表中的所有记录以及另一个
SELECT a.id
, SUM(a.no_of_units_purchase)
FROM month a
, year b
WHERE a.id=b.id
GROUP
by b.id
上述查询的输出:
请引导我得到预期的结果
提前感谢。内部联接(如您所发现的)只返回两个表之间存在匹配的情况。可以使用外部联接返回一个表中的所有记录以及另一个表中的匹配记录
SELECT a.id
, SUM(a.no_of_units_purchase), SUM(IFNULL(b.no_of_units, 0))
, SUM(a.no_of_units_purchase) - SUM(IFNULL(b.no_of_units, 0))
FROM month a
LEFT JOIN year b
ON a.id=b.id
GROUP by a.id
从您的示例中不清楚是否需要输出“年”表中有记录但“月”表中没有相应行的情况,但这也是可能的
一些DBMS支持“完全外部联接”,它返回两个表中的所有记录,并链接匹配的记录。MySQL不直接支持这一点,但很容易重新创建行为:
SELECT a.id
, SUM(a.no_of_units_purchase), SUM(IFNULL(b.no_of_units, 0))
FROM month a
LEFT JOIN year b
ON a.id=b.id
GROUP by a.id
UNION
SELECT b.id, 0, SUM(b.no_of_units)
FROM year b
LEFT JOIN month a
ON b.id=a.id
WHERE a.id IS NULL
GROUP BY b.id
您应该使用左联接而不是简单联接,因为表month不能包含给定年份的购买。可行的查询是:
select year.id,
year.no_of_units,
sum(ifnull(month.no_of_units_purchase, 0)) as no_of_units_purchase,
year.no_of_units - sum(ifnull(month.no_of_units_purchase, 0)) as balance_units
from year
left join month on year.id = month.id
group by
year.id,
year.no_of_units
见: