2014-11-14 42 views
1

我有這樣的查詢:如何使用左連接的用戶聚合功能? 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的第一個查詢,如何解決呢?

+0

移動'invoice.userId ='3000'作爲條件。 –

+0

@AbhikChakraborty,已經在條款 –

+0

中,我認爲你需要另一個評級加入?嘗試'內部連接' –

回答

1

試試下面的查詢:

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 
+0

感謝您的回答,但是如何從一個查詢中的發票中選擇計數和總和,我的意思是:SELECT business.bussId,(從invoice.bussId = a.bussId和發票的invoice中選擇count(invoices.userId),sum(invoice.price)。(選擇COUNT(rating.bussId)from rating where rating.bussId = a.bussId)as ratingCount, FROM business a WHERE business.bussId = 100 – david

+0

總而言之,您必須編寫另一個子查詢,因爲子查詢必須返回單個值.. –

0

您還沒有發佈任何測試數據或任何表聲明所以這正在對這些假設。

您當前的查詢將獲得發票和評級的每項業務組合。因此,如果有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 
+0

感謝您的答案,計數工作正常,但我怎麼能做SUM(invoices.price)? – david

+0

你不能直接。您需要使用子查詢來獲取SUM。 – Kickstart