如何使用左连接聚合函数?mysql
我有一个疑问:如何使用左连接聚合函数?mysql,mysql,sql,left-join,aggregate,Mysql,Sql,Left Join,Aggregate,我有一个疑问: 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 (rat
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
COUNTinvoices.userId用户应该返回invoices表中的行数,其中userId=3000,bussId=100。
换句话说,此查询:
SELECT COUNT(*) as invoice FROM `invoices` WHERE bussId = '100' AND userId = '30000'.
第二个查询返回计数*=3,当我用户离开JOIN时第一个查询返回15,如何解决这个问题?尝试下面的查询:
选择
business.bussId,
选择COUNTinvoices.userId
从发票
其中invoice.bussId=a.bussId
和invoice.userId='3000'作为发票,
选择COUNTrating.bussId
从评级
其中rating.bussId=a.bussId作为ratingCount
从企业a
其中business.bussId=100
您还没有发布任何测试数据或任何表声明,因此这是在对这些数据进行假设 您当前的查询将获得业务的发票和评级的每个组合。因此,如果有3张发票和5个评级,将产生15种组合 通常,这可以通过使用COUNTDISTINCT来解决,但您正在计算发票的用户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
移动invoice.userId='3000'作为where条件。@AbhikChakraborty,已经有了,在第条中,我认为您需要另一个联接来进行评级?请重试。您的查询将不起作用,因为您需要发票,并且评级表将返回不同的结果集。一个可能有15个结果,另外3个结果,在第一次查询中都会返回15,我想你需要计算每行的发生次数。可能COUNTDISTINCT invoices.id假设invoices.id对于invoices表是唯一的。您可能有3张发票和5个评级,此时3 x 5=15行谢谢您的回答,但是我如何在一个查询中从发票中选择计数和总和,我的意思是:选择business.bussId,选择countinvoices.userId,sumvoice.price from invoice where invoice.bussId=a.bussId和invoice.userId='3000'作为发票,从rating where rating.bussId=a.bussId中选择COUNTrating.bussId作为ratingCount,从business a where business.bussId=100中选择COUNTrating.bussId作为sum,您必须编写另一个子查询,因为子查询必须返回单个值。谢谢您的回答,count很好,但我该怎么做呢?价格?你不能直接。您需要使用子查询来获取总和。