2013-10-01 54 views
0

我有兩個幾乎相同的查詢,一個是GROUP BY,一個沒有。結果非常不同。 GROUP BY查詢結果超過了非GROUP BY查詢結果的兩倍。MySQL - 爲什麼近2個相同的查詢會導致2個不同的結果? GROUP BY

查詢1:

SELECT table2.name, COUNT(DISTINCT(op.id)) 
FROM op INNER JOIN table1 ON table1.EID = op.ID 
    INNER JOIN table3 ON table3.id = table1.jobid 
    INNER JOIN table2 ON table2.id = table3.CatID 
WHERE op.BID = 1 
    AND op.ActiveStartDate <= NOW() 
    AND op.ActiveEndDate >= NOW() 
GROUP BY table2.name 
ORDER BY COUNT(*) DESC; 

問題2:

SELECT op.Type, COUNT(DISTINCT op.id) 
FROM op 
WHERE op.BID = 1 
AND op.ActiveStartDate <= NOW() 
    AND op.ActiveEndDate >= NOW() 
ORDER BY op.Type ASC; 

這些應該導致同樣的結果。當玩弄它們時,一旦我從查詢1中刪除「GROUP BY」,結果是一樣的。如果我將「GROUP BY」放回查詢1中,結果會增加一倍以上。

編輯:似乎額外的INNER JOINS不影響結果,而是查詢1中的GROUP BY。如果我在查詢1中刪除GROUP BY,則兩個查詢之間的結果是相同的。如果我將GROUP BY添加回查詢1,結果會非常不同。

+0

的交代? –

+0

2個查詢的WHERE條件是相同的,我正在查看COUNT(DISTINCT op.id),因爲它應該是相同的結果....如果在查詢1中加入的表確實是準確的連接,爲什麼會DISTINCT ID計數是否增加?或者,我應該加入第二個查詢中的表格,雖然不必要? – Ken

回答

0

我不知道你怎麼看那些是幾乎相同的查詢;他們是非常不同的。無論如何,你不應該從第一個刪除GROUP BY,但在第二個查詢添加GROUP BY

SELECT op.Type, COUNT(DISTINCT op.id) 
FROM op 
WHERE op.BID = 1 
AND op.ActiveStartDate <= NOW() 
    AND op.ActiveEndDate >= NOW() 
GROUP BY op.Type 
ORDER BY op.Type ASC; 

當然,這並不意味着你會得到相同的結果,無論如何,由於第一個查詢有3個額外的連接。

+0

是的,第二個確實需要GROUP BY,但這並沒有改變COUNT的結果。由於COUNT(DISTINCT op.id)在兩個查詢中都是相同的,並且INNER JOINS確實是第一個準確的連接,所以我不確定爲什麼添加這些連接會改變結果。第二個查詢是否也有這些連接,雖然不必要? – Ken

0

在我看來,這些查詢根本不「幾乎相同......」。 你有INNER JOIN與其他可以有重複的表,因此INNER JOIN將增加該數字的行數。 爲什麼你會期望這些是相同的,當第一查詢有聯接兩個額外的表,你可以檢查在這裏

INNER JOIN and GROUP BY

相關問題