首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mysql sum()两个连接表,将结果相乘

mysql sum()两个连接表,将结果相乘
EN

Stack Overflow用户
提问于 2013-09-10 08:38:15
回答 2查看 219关注 0票数 0

我有两个表: invoices和invoiceitems。

invoiceitems包含每张发票上的项目

例如:

代码语言:javascript
复制
invoices
----------------------------------
| id  |status| net | tax | total |
----------------------------------
| 72  |paid  | 100 | 120 |  220  |
| 73  |unpaid| 50  | 5   |  55   |
| 74  |paid  | 400 | 45  |  445  |
| 75  |paid  | 250 | 67  |  317  |


invoiceitems
-------------------------------
| invoiceid |itemdescription |
-------------------------------
| 72        | apples         |
| 72        | pears          |
| 72        | oranges        |
| 73        | lemons         |
| 73        | oranges        |

如您所见,在本例中,发票号72有3个项目

我想搜索我的发票中的某些东西,并显示某些字段的计数。

但我的问题是,sum值似乎乘以了第二个表中的字段数。

代码语言:javascript
复制
$sql = "SELECT COUNT(DISTINCT invoices.id) AS num, 
SUM(CASE invoices.status WHEN 'Paid' THEN 1 ELSE 0 END) AS numpaid, 
SUM(CASE invoices.status WHEN 'Paid' THEN invoices.total ELSE 0 END) AS sumtotal,
FROM invoices 
LEFT JOIN invoiceitems ON invoices.id=invoiceitems.invoiceid
WHERE invoices.id LIKE :invoiceid 
AND IFNULL(opcinvoiceitems.itemdescription, '')  LIKE :itemdescription
AND invoices.net LIKE :net 
AND invoices.tax LIKE :tax 
AND invoices.total LIKE :total
AND ......" 

因此,使用上面的方法,发票72的总和将乘以3

我真的很抱歉,我知道这真的解释得很糟糕,但我无法用其他方式解释它,我已经寻找了很长时间,但没有找到解决方案。希望有人能帮上忙。谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-09-10 08:48:48

执行联接时,通过匹配原始表中的记录来生成所创建的记录。因此,您将有3条记录用于发票#72,每条记录都是通过将#72的单个发票记录与#72的每个发票项进行匹配而创建的。每个合并的记录将具有相同的总数(在本例中为220),因此总和将是该总数的3倍。

听起来你只是想要总数;你可以直接使用total,或者你可以把你的sum除以count (你似乎也在计算)。

票数 0
EN

Stack Overflow用户

发布于 2013-09-10 08:51:28

完成所需操作的一种方法是在连接之前预先聚合invoiceItems表:

代码语言:javascript
复制
SELECT COUNT(i.id) AS num, 
       SUM(CASE i.status WHEN 'Paid' THEN 1 ELSE 0 END) AS numpaid, 
       SUM(CASE i.status WHEN 'Paid' THEN i.total ELSE 0 END) AS sumtotal,
FROM invoices  i LEFT JOIN
     (select ii.invoiceid, sum(. . .) as . . .
      from invoiceitems ii
      where IFNULL(ii.itemdescription, '')  LIKE :itemdescription AND
      group by ii.invoiceid
     ) ii
     ON i.id = ii.invoiceid
WHERE i.id LIKE :invoiceid AND
      i.net LIKE :net  AND
      i.tax LIKE :tax AND
      i.total LIKE :total AND .....

您的查询实际上并未在from子句中使用invoiceitems,因此很难提供更详细的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18709104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档