繁体   English   中英

如何使用左连接用户聚合函数? mysql

[英]How to user aggregate function with left join ? mysql

我有这个查询:

SELECT business.bussId, COUNT(invoices.userId) as invoices, COUNT(rating.bussId) as ratingCount ,
       FROM business
       LEFT JOIN invoice ON (invoice.bussId = business.bussId AND invoice.userId = '3000' )
       LEFT JOIN rating ON (rating.bussId = business.bussId )
       WHERE business.bussId=100

COUNT(invoices.userId) 用户应该返回发票表中的行数,其中 userId = 3000 AND bussId = 100。换句话说,这个查询:

SELECT COUNT(*) as invoice FROM `invoices` WHERE bussId = '100' AND userId = '30000'.

第二个查询返回 COUNT (*) = 3,第一个查询(当我使用 LEFT JOIN 时)返回 15,如何解决?

尝试以下查询:

SELECT 
    business.bussId, 
    (SELECT COUNT(invoices.userId) 
        FROM invoice 
        WHERE invoice.bussId = a.bussId 
          AND invoice.userId = '3000') as invoices, 
    (SELECT COUNT(rating.bussId) 
        FROM rating 
        WHERE rating.bussId = a.bussId) as ratingCount
FROM business a
WHERE business.bussId=100

您尚未发布任何测试数据或任何表格声明,因此这是对这些数据进行假设。

您当前的查询将获得企业的所有发票和评级组合。 因此,如果有 3 张发票和 5 个评级,则会产生 15 种组合。

通常这可以通过使用 COUNT(DISTINCT ) 来解决,但是您正在计算发票的用户 ID 数量,当这是一个常数时。

假设您的发票表和评级表都有称为 id 的唯一键,那么您应该能够将计数更改为对这些字段进行计数:-

SELECT business.bussId, COUNT(DISTINCT invoices.id) as invoices, COUNT(DISTINCT rating.id) as ratingCount 
FROM business
LEFT JOIN invoice ON (invoice.bussId = business.bussId AND invoice.userId = '3000' )
LEFT JOIN rating ON (rating.bussId = business.bussId )
WHERE business.bussId = 100

这避免了使用子查询,这取决于数据通常会表现不佳。 尽管在这种情况下看起来您可能只返回一行,因此这不太可能成为问题

编辑

为了获得价格的总和,这使用子查询来获取发票的数量和价格的总和,然后将其加入到业务表中:-

SELECT business.bussId, invoice_count as invoices, invoice_price, COUNT(DISTINCT rating.id) as ratingCount 
FROM business
LEFT JOIN 
(
    SELECT bussId, COUNT(id) AS invoice_count, SUM(price) AS invoice_price
    FROM invoice
    WHERE userId = '3000'
    GROUP BY bussId
) invoice_sub
ON invoice_sub.bussId = business.bussId 
LEFT JOIN rating ON (rating.bussId = business.bussId )
WHERE business.bussId = 100
GROUP BY business.bussId, invoices, invoice_price

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM