• 締切済み

MYSQLで重複せずにカウント上位から取得したい

お世話になります。 MYSQLにて以下のようなtableがあるとします。 id ex_id name count flag time memo 1 1 山田 100 on 10:11 テスト 2 1 山田 80 on 10:12 テスト2 3 2 田中 50 on 10:13 テスト3 4 3 鈴木 30 on 10:14 テスト4 5 3 鈴木 110 on 10:14 テスト5 6 3 鈴木 10 on 10:14 テスト6 このうち、countの数字が高いものから表示したいのですが、 ex_idが重複する場合はその数字が最も高いもののみ表示したく考えています。 目的とした表示結果順は以下です。 id ex_id name count flag time memo 5 3 鈴木 110 on 10:14 テスト5 1 1 山田 100 on 10:11 テスト 3 2 田中 50 on 10:13 テスト3 distinctやgroup byなど色々考えてみたのですが、思ったような挙動になりませんでした。 以上、よろしくお願い致します。

みんなの回答

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.4

select * from tbl t1 where count = (select max(count) from tbl t2 where t1.ex_id = t2.ex_id) order by count desc ではどうでしょう?

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.3

ex_id, countでindexを作ればどうなるでしょう?

pmemark22
質問者

お礼

回答ありがとうございます。 indexは既にしてあるのですが、ダメでした。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

#1さんの補足ですが、とくにconcatする必要はありません create table tbl(id int,ex_id int,name varchar(20),count int,flag set('on','off') default 'on',timex time,memo text); insert into tbl values(1,1,'山田',100,'on','10:11','テスト'),(2,1,'山田',80,'on','10:12','テスト2'),(3,2,'田中',50,'on','10:13','テスト3'),(4,3,'鈴木',30,'on','10:14','テスト4'),(5,3,'鈴木',110,'on','10:14','テスト5'),(6,3,'鈴木',10,'on','10:14','テスト6'); select * from tbl where (ex_id,count) in (select ex_id,max(count) from tbl group by ex_id) order by count desc

pmemark22
質問者

お礼

回答ありがとうございます。 処理としまして、サンプル程度のデータ数なら良いのですが、30,000件程度あるテーブルで実行すると重すぎてダウンしてしまうようです。 limitを10程度にしてみても、実行時間が10秒近くかかってしまいました。 何か良い方法は無いでしょうか?

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

DB2ですと、こうなります。 I:\>db2 select * from Mysql ID EX_ID NAME COUNT FLAG TIME MEMO -- ----- ---------- ----------- ---- ----- -------------------- 1 1 山田 100 on 10:11 テスト 2 1 山田 80 on 10:12 テスト2 3 2 田中 50 on 10:13 テスト3 4 3 鈴木 30 on 10:14 テスト4 5 3 鈴木 110 on 10:14 テスト5 6 3 鈴木 10 on 10:14 テスト6 6 レコードが選択されました。 I:\>db2 select * from Mysql where concat(ex_id, count) in(select distinct concat(ex_id, max(count)) from Mysql group by ex_id) order by count desc ID EX_ID NAME COUNT FLAG TIME MEMO -- ----- ---------- ----------- ---- ----- -------------------- 5 3 鈴木 110 on 10:14 テスト5 1 1 山田 100 on 10:11 テスト 3 2 田中 50 on 10:13 テスト3 3 レコードが選択されました。 concatがあればいいのですが・・・

pmemark22
質問者

お礼

回答ありがとうございます。 処理としまして、サンプル程度のデータ数なら良いのですが、30,000件程度あるテーブルで実行すると重すぎてダウンしてしまうようです。 limitを10程度にしてみても、実行時間が10秒近くかかってしまいました。 何か良い方法は無いでしょうか?

関連するQ&A