Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用左连接聚合函数?mysql_Mysql_Sql_Left Join_Aggregate - Fatal编程技术网

如何使用左连接聚合函数?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很好,但我该怎么做呢?价格?你不能直接。您需要使用子查询来获取总和。