首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中使用和连接返回意外结果

在MySQL中使用和连接返回意外结果
EN

Stack Overflow用户
提问于 2018-11-15 15:09:47
回答 4查看 87关注 0票数 1

我有这样的表:customers每个客户都有许多发票,而且每个发票都有很多细节。

ID为574413的客户拥有以下发票:

代码语言:javascript
复制
select customer_invoices.customer_id,
       customer_invoices.id,
       customer_invoices.total_price
from customer_invoices
where customer_invoices.customer_id = 574413;

结果:

代码语言:javascript
复制
customer_id     invoice_id  total_price
574413          662146      700.00
574413          662147      250.00

这里的每个发票都有两个细节(或发票行):

第一张发票662146

代码语言:javascript
复制
select customer_invoice_details.id as detail_id,
       customer_invoice_details.customer_invoice_id as invoice_id,
       customer_invoice_details.total_price as detail_total_price
from customer_invoice_details
where customer_invoice_details.customer_invoice_id = 662146;

结果:

代码语言:javascript
复制
detail_id   invoice_id  detail_total_price
722291      662146      500.00
722292      662146      200.00

第二张发票662147

代码语言:javascript
复制
select customer_invoice_details.id as detail_id,
       customer_invoice_details.customer_invoice_id as invoice_id,
       customer_invoice_details.total_price as detail_total_price
from customer_invoice_details
where customer_invoice_details.customer_invoice_id = 662147;

结果:

代码语言:javascript
复制
detail_id   invoice_id  detail_total_price
722293      662147      100.00
722294      662147      150.00

我对这个查询有一个问题:

代码语言:javascript
复制
select customers.id as customerID,
       customers.last_name,
       customers.first_name,
       SUM(customer_invoices.total_price) as invoice_total,
       SUM(customer_invoice_details.total_price) as details_total
from customers
       join customer_invoices
         on customer_invoices.customer_id = customers.id
       join customer_invoice_details
         on customer_invoice_details.customer_invoice_id = customer_invoices.id
where customer_id = 574413;

意外结果:

代码语言:javascript
复制
customerID  last_name   first_name  invoice_total   details_total
574413      terry       amine       1900.00         950.00

我需要发票的SUMtotal_price,以及每个客户的详细信息的total_priceSUM。在本例中,我应该将950作为total_price为两列(invoice_total& details_total),但事实并非如此。我做错了什么&我怎样才能得到正确的结果?类似主题中的答案对于这种情况没有解决办法。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-11-15 15:32:27

当将普通列与聚合函数(例如和)混合时,需要使用GROUP BY,其中列出来自SELECT的普通列。

total_price中发票数量过多的原因是,每个细节行的总和也是计算出来的,因为它是连接的一部分。用这个:

代码语言:javascript
复制
select c.id as customerID,
       c.last_name,
       c.first_name,
       SUM(ci.total_price) as invoice_total,
       SUM((select SUM(d.total_price)
        from customer_invoice_details d
        where d.customer_invoice_id = ci.id)) as 'detail_total_price'
from customers c
       join customer_invoices ci on ci.customer_id = c.id
where c.id = 574413
group by c.id, c.last_name, c.first_name

大小提琴

票数 1
EN

Stack Overflow用户

发布于 2018-11-15 15:43:01

你正在沿着多个维度聚集。这很有挑战性。我建议在每个维度上独立地进行聚合:

代码语言:javascript
复制
select c.id as customerID, c.last_name, c.first_name,
       ci.invoice_total,
       cid.details_total
from customers c join
     (select ci.sum(ci.total_price) as invoice_total
      from customer_invoices ci
      group by ci.customer_id
     ) ci
     on ci.customer_id = c.id join
     (select ci.sum(cid.total_price) as details_total
      from customer_invoices ci join
           customer_invoice_details cid
           on cid.customer_invoice_id = ci.id
      group by ci.customer_id
     ) cid
     on cid.customer_id = c.id
where c.id = 574413;

更快的版本(针对一个客户)使用相关的子查询:

代码语言:javascript
复制
select c.id as customerID, c.last_name, c.first_name,
       (select ci.customer_id, sum(ci.total_price) as invoice_total
        from customer_invoices ci
        where ci.customer_id = c.id 
       ) as invoice_total,
       (select ci.customer_id, sum(cid.total_price) as details_total
        from customer_invoices ci join
             customer_invoice_details cid
             on cid.customer_invoice_id = ci.id
        where ci.customer_id = c.id
       ) as details_total
from customers c 
where c.id = 574413;
票数 1
EN

Stack Overflow用户

发布于 2018-11-15 15:47:40

我对sub查询使用了联接,然后对这些和进行了一次求和。

代码语言:javascript
复制
SELECT c.id as customerID,
   c.last_name,
   c.first_name
   SUM(i.sum) as invoice_total,
   SUM(d.sum) AS details_total
FROM customers c
JOIN (SELECT id, customer_id, SUM(total_price) AS sum
      FROM customer_invoices
      GROUP BY id, customer_id) AS i ON i.customer_id = c.id
JOIN (SELECT customer_invoice_id as id, SUM(total_price) AS sum
      FROM customer_invoice_details 
      GROUP BY customer_invoice_id) AS d ON d.id = i.id
WHERE c.id = 574413
GROUP BY c.id, c.name
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53322414

复制
相关文章

相似问题

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