[英]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.