2012-04-12 57 views
0

我試圖從表中提取出現不同字段的每個不同值的最大次數的值。例如,如果數據集是:mysql哪個值有最大計數

a x 
a x 
a y 
b x 
b y 
c x 
c y 
c y 

查詢會產生

a x 2 
b x 1 
c y 2 

我的實驗中使用以下命令:

CREATE TABLE IF NOT EXISTS `maxcount` (
    `what` varchar(1) DEFAULT NULL, 
    `loc` varchar(1) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `maxcount` (`what`, `loc`) VALUES 
('a', 'x'), 
('a', 'x'), 
('a', 'y'), 
('b', 'x'), 
('b', 'y'), 
('c', 'x'), 
('c', 'y'), 
('c', 'y'); 

第一部分很容易:

select what, loc, count(loc) howmany from maxcount group by what, loc; 

我還沒有想出是如何利用它來獲取每一行對應一個「什麼」顯示,具有最大的最大數量和價值的LOC的值。

解決方案不是:

select what, loc, max(howmany) from (
select what, loc, count(loc) howmany from maxcount group by what, loc) 
A group by what; 

因爲它產生:

a x 2 
b x 1 
c x 2 

你的指導欣然接受!

喬治

+0

這確實提供了一個解決方案:'選擇什麼,祿,MAX(的howmany)從最( 選擇what,loc,count(loc)howmany from maxcount group by what,loc order by count(loc)desc) 一組由什麼組成;' – geoB 2012-04-12 20:42:43

+0

您仍然在最外層的組中選擇'loc'也不在組合中,因此不保證能夠返回正確的結果。對於簡化的模式,它可能會正常工作,但您會遇到大桌子的問題。 – piotrm 2012-04-12 20:48:20

+0

謝謝。我猜我的解決方案不適用於我的現實世界問題。 – geoB 2012-04-13 12:37:07

回答

0

檢查了這一點...爲了避免引用同組的結果,我創建了一個表...你應該做的處理後刪除它,或者用(SELECT what, loc, count(loc) howmany FROM maxcount GROUP BY what, loc) as tblX更換maxcounttemp我試着使它成爲TEMPORARY,但如果外部表是相同的,則不能在子查詢中使用它。

CREATE TABLE `maxcounttemp` (
    `what` varchar(1) DEFAULT NULL, 
    `loc` varchar(1) DEFAULT NULL, 
    `howmany` int DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO maxcounttemp (
    SELECT what, loc, count(loc) howmany FROM maxcount GROUP BY what, loc 
); 

SELECT mct.what, mct.loc, mct.howmany 
FROM maxcounttemp mct 
WHERE (mct.what, mct.howmany) IN (
    SELECT mct2.what, MAX(mct2.howmany) 
    FROM maxcounttemp mct2 
    WHERE mct2.what = mct.what 
    GROUP BY mct2.what 
) GROUP BY (mct.what); 

希望它可以幫助...記住,BX或同樣可以在此查詢...

+0

謝謝。我會與此合作。非常感謝 – geoB 2012-04-13 12:39:27

+0

好極了,如果它確實有效,請將它標記爲答案...否則,請告訴我缺少什麼(也許避開那張臨時表?),並且我會努力修復它;) – g3rv4 2012-04-13 14:33:34

+0

我在這裏是新來的我還沒有完全得到通知和其他協議。標記爲答案。我已經將其構建到我的應用程序中。有了使用Engine = Memory的更多功能,我可以將處理時間(對於此和其他一組查詢)減半。再次感謝。 g – geoB 2012-04-13 21:36:52