MySQL加入表达式

时间:2015-12-04 03:50:41

标签: mysql join

我有两张桌子。一个包含项目数量的商品,第二个商品包含商品分配。我正在尝试编写一个查询,生成表格,显示每个商品的商品数量和总分配金额。

示例表`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`

并且没有分配的优惠也不会被打印。

3 个答案:

答案 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