2011-10-04 32 views
1

任何人都可以幫助我理解MySQL的Group By如何工作以及我在做什麼錯誤?我正在使用一個包含兩個表格,拍賣和批次的數據庫。拍賣表中有一個'auctionid'的欄目,它將每個拍賣品與相關拍賣鏈接起來,拍賣和拍賣之間的關係很多。MySQL Group通過消除太多的信息

我從批次和拍賣中選擇了大量信息,包括使用幾個總和和計數(不同)功能在拍賣基礎上總計一些拍賣記錄。

我的查詢是這樣的:

SELECT 
    auction.`countryId`, 
    auction.`date`, 
    auction.`name`, 
    auction.`awardComments`, 
    lots.`lotName`, 
    lots.`region`, 
    lots.`popCovered`, 

    SUM(lots.'size'), 
    SUM(lots.`paired`), 
    SUM(lots.`unpaired`), 
    COUNT(DISTINCT 'lots.winner') 

FROM auction join lots USING ('awardid') 

GROUP BY lots.'awardid' 

「awardid」是該拍賣表的主鍵,爲大量的表的外鍵。 'lotid'是批表的主鍵,但未使用。

當我運行此查詢時,我爲每次拍賣獲得一行,我正在尋找的是每一批的一行,拍賣信息與該拍賣中的每批次的相同,以及計數拍賣表中每次拍賣的總大小和獲獎者人數。如果我擺脫了查詢的'group by'和'sum'部分,那麼我會得到正確的行數,每個行都有一個。是否有一種方法可以通過sum和count函數獲得我需要的所有行?基本上我只希望group子句適用於SUM和COUNT函數,如果這樣做有道理的話 - 我希望爲每次拍賣計算獲勝者的數量,但在該拍賣的每個拍賣結果中顯示。

+0

該表的候選鍵是什麼? – JStead

+0

看起來你錯過了表中的一個逗號:''拍賣,很多' –

+0

@eugeney,他實際上錯過了一個'join'關鍵字。 – Johan

回答

1
SELECT 
    a.countryId, 
    a.`date`, 
    a.name, 
    a.awardComments, 
    l.lotName, 
    l.region, 
    l.popCovered, 

    sums.total_size, 
    sums.total_paired, 
    sums.total_unpaired, 
    sums.winners 

FROM auction a 
INNER JOIN lots l on (a.awardid = l.awardid) 
INNER JOIN (
    SELECT 
    a2.id as auction_id 
    SUM(l2.size) as total_size, 
    SUM(l2.paired) as total_paired, 
    SUM(l2.unpaired) as total_unpaired, 
    COUNT(DISTINCT l2.winner) as winners 
    FROM AUCTION a2 INNER JOIN lots l2 ON (a2.awardid = l2.awardid) 
    GROUP BY a2.id 
) sums ON (sums.auction_id = a.id) 

對於來自同一拍賣的很多拍品,這確實重複了每次拍賣的相同總計。

+0

我不認爲這會做OP的要求:這筆款項將按每手拍賣(即平凡)而非每次拍賣。 –

+0

@IlmariKaronen,我知道,OP特別要求每批1行。他已經有每次拍賣的查詢。 – Johan

+0

這給了我合適的行數,但SUM和COUNT函數並沒有總結多少,他們只是給我這個地段的答案 - 每個地段都有一個贏家,但我想看看有多少不同的獲獎者每次拍賣都有。我希望每條生產線都包含有關整個拍賣以及特定拍賣的信息。 – mindwideopen

0

我想這樣的事情可以工作(警告:未經):

SELECT 
    auction.`countryId`, 
    auction.`date`, 
    auction.`name`, 
    auction.`awardComments`, 
    lots.`lotName`, 
    lots.`region`, 
    lots.`popCovered`, 
    sums.`size`, 
    sums.`paired`, 
    sums.`unpaired`, 
    sums.`winners` 
FROM auction 
JOIN lots USING (`awardid`) 
JOIN (
    SELECT 
    `awardid`, 
    SUM(`size`) AS `size`, 
    SUM(`paired`) AS `paired`, 
    SUM(`unpaired`) AS `unpaired`, 
    COUNT(DISTINCT lots.`winner`) AS `winners` 
    FROM lots GROUP BY `awardid` 
) AS sums USING (`awardid`) 

也就是說,你做的lots表子查詢計算每個拍賣的款項,然後對待,結果就好像它是一個可以加入結果的單獨表格一樣。

+0

你剛剛複製粘貼我的答案: - ?儘管'using'子句不明確,但我認爲它不會起作用。而子選擇會添加所有地塊,而不管它們屬於哪個拍賣。 – Johan

+0

@Johan:偉大的思想家都認爲。 :)無論如何,子選擇應該工作:請記住'lots.awardid'是拍賣表的外鍵,因此具有相同獎勵的很多都屬於同一拍賣。不過,你可能對'USING'語法是正確的;我認爲它應該像現在這樣工作,但我沒有測試它。 –