2012-04-12 56 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