我有两张桌子。一个包含项目数量的商品,第二个商品包含商品分配。我正在尝试编写一个查询,生成表格,显示每个商品的商品数量和总分配金额。
示例表`offers`:
+----+----+----+
|oid |uid |amt |
+----+----+----+
| 1| 413| 10|
| 2| 297| 7|
+----+----+----+
示例表`allocations`:
+----+----+------+
|aid |oid |alloc |
+----+----+------+
| 1| 2| 4|
| 2| 2| 2|
+----+----+------+
我想要以下结果:
+----+----+------+
|oid |amt |alloc |
+----+----+------+
| 1| 10| 0|
| 2| 7| 6|
+----+----+------+
我尝试了以下查询:
SELECT `offers`.`oid`, `offers`.`amt`, COALESCE(SUM(`allocations`.`alloc`),0)
FROM `offers`
LEFT JOIN `allocations` ON `allocations`.`oid`=`offers`.`oid`
但是,总和适用于整个表,而不仅仅是满足
的条目`allocations`.`oid`=`offers`.`oid`
并且没有分配的优惠也不会被打印。
答案 0 :(得分:0)
尝试使用 GROUP BY 。
SELECT `offers`.`oid`, `offers`.`amt`, COALESCE(SUM(`allocations`.`alloc`),0)
FROM `offers`
LEFT JOIN `allocations` ON `allocations`.`oid`=`offers`.`oid`
GROUP BY offers.oid
(我认为offers.oid
是您的主键?)
严格来说,应该是
GROUP BY offers.oid, offers.amt
也就是说,任何不是聚合函数结果的列都必须列在GROUP BY
子句中。某些服务器配置为强制执行此操作,而有些则不是。
答案 1 :(得分:0)
任何聚合函数(例如sum())都将在整个结果集中运行,除非您提供group by子句。
SELECT `offers`.`oid`, `offers`.`amt`, COALESCE(SUM(`allocations`.`alloc`),0)
FROM `offers`
LEFT JOIN `allocations` ON `allocations`.`oid`=`offers`.`oid`
GROUP BY `offers`.`oid`, `offers`.`amt`
但是,我没有得到'没有分配的提议不被打印'的部分,因为左连接应该处理这个,除非在你的真实查询中,2个表的顺序是相反的。
答案 2 :(得分:0)
所以在这里你必须使用group by子句为每个oid做总和......
SELECT `offers`.`oid`, `offers`.`amt`, COALESCE(SUM(`allocations`.`alloc`),0) FROM `offers`
LEFT JOIN `allocations` ON `allocations`.`oid`=`offers`.`oid` group by oid