2012-04-12 9 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'); 

最初一部は簡単:

私がまだ理解していないのは、最大数と最大値を持つlocの値を示す "what"ごとに1行を取得する方法です。

ソリューションではありません:

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

...それは助け... BXかによっては、このクエリにも同様に可能であることに注意してください願っています' – geoB

+0

あなたが最も外側のグループの中で' loc'をまだ選択していますが、あなたはまだ何もしていないので、 'loc'を選択しています。グループで集計されていないため、正しい結果を返すことが保証されていません。シンプルなスキーマではうまくいくかもしれませんが、大きなテーブルで問題が発生します。 – piotrm

+0

ありがとうございます。私の解決策は私の現実世界の問題ではうまくいかないと思った。 – geoB

答えて

0

チェックこのアウト...結果の同じグループを参照しないようにするために、私は私がしようとしたテーブル...あなたは、処理を行った後にそれを削除、または(SELECT what, loc, count(loc) howmany FROM maxcount GROUP BY what, loc) as tblXでmaxcounttempを交換する必要がありますを作成しましたそれをTEMPORARYにしますが、外部表が同じものであれば、サブクエリー内で使用することはできません。 `何を選択し、LOC、最大(howManyが)から最も:

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); 

これは解決策を提供してい

+0

ありがとうございます。私はこれで作業します。多くの方に感謝します – geoB

+0

すごくいいです、それは答えとしてマークしてください...そうでなければ何が欠けているのかを教えてください(その一時的なテーブルを避けるのでしょうか?)それを修正するにはどうすればいいでしょうか) – g3rv4

+0

私はまだ通知や他のプロトコルをまだ入手していません。答えとしてマーク。私はそれを私のアプリケーションに組み込んだ。 Engine = Memoryを使用することで、処理時間(これと他のクエリのセット)を半分に減らすことができました。再度、感謝します。 g – geoB

関連する問題