• 締切済み

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など色々考えてみたのですが、思ったような挙動になりませんでした。 以上、よろしくお願い致します。

  • MySQL
  • 回答数4
  • ありがとう数16

みんなの回答

  • 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/6970)
回答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/6970)
回答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

  • php、mysqlを使用した得点ランキング

    現在得点ランキングを作成しています。 mysqlの中に入っているデータを取り出して表示させたいのですが、 なかなかうまくいかず困っています。 mysql内 |id|name| |1|山田| |2|佐藤| |3|山田| |4|鈴木| |5|佐藤| |6|山田| |7|鈴木| |8|田中| としております。 表示方法は 順位| 名前 | 得点数 1位 | 山田 | 3 2位 | 佐藤 | 2 2位 | 鈴木 | 2 4位 | 田中 | 1 としたいです。 mysql内に入っている名前の数で得点数を出してなおかつソートで降順にしたいです。 お分かりの方がいらっしゃいましたらご教示お願いします。

    • ベストアンサー
    • PHP
  • Excel 数字から判断して文字を表示

    Excelにて以下の様な処理を関数を用いて行いたいと思います(都合上、VBは不可) 1)数字に名前を割り当てる ex:「1-田中」、「2-鈴木」、「3-佐藤」、「4-山田」、「5-橋本」、「6-山本」、「7-沢田」、「8-山岡」 2)1~9までの数字を入力する ex:「12345」、「3456」、「2487」 3)2で入力された数字を元に1の名前を表示する ex: 「12345」→「田中、鈴木、佐藤、山田、橋本」 「3456」→「佐藤、山田、橋本、山本」 「2487」→「鈴木、山田、山岡、沢田」 この様な処理はどうすれば実現出来ますでしょうか? 数字の組み合わせがいくつもあるのでVLOOKUPは使えない。と思い、質問させて頂きました よろしくお願い致します。

  • Mysqlで複数テーブルの参照

    Mysqlで複数テーブルの参照 お世話になります。Mysqlについて質問させてください。 現在、それぞれnameとdateとflagの3フィールドをもつテーブルが、2つあります。 もともと別の用途で準備したものなのですが、 2つのテーブルのflagを参照して、1のものだけdate順に並べることが出来るでしょうか? ■テーブル1 -----------------------------  name |  date  |flag| -----------------------------  田中 | 2010-06-01 | 1 -----------------------------  山田 | 2010-09-01 | 1 -----------------------------  田辺 | 2010-10-01 | 2 -----------------------------  田所 | 2010-11-01 | 2 ----------------------------- ■テーブル2 -----------------------------  name |  date  |flag| -----------------------------  加藤 | 2010-10-01 | 1 -----------------------------  佐藤 | 2010-07-01 | 1 -----------------------------  織田 | 2010-12-01 | 2 -----------------------------  斎藤 | 2010-01-01 | 2 ----------------------------- ■求める結果 -----------------------------  name |  date  |flag| -----------------------------  田中 | 2010-06-01 | 1 -----------------------------  佐藤 | 2010-07-01 | 1 -----------------------------  山田 | 2010-09-01 | 1 -----------------------------  加藤 | 2010-10-01 | 1 ----------------------------- 具体的なSQL文でなくとも構いません。参考になるような情報、サイトをご存じでしたら、教えてください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 無視されるdistinct

    お世話になります  大規模商談をまとめた営業のリストを作るSQLを書こうとしています。   営業部員テーブル (test.person) id | name ----+------ 1 | 山田 2 | 高橋 3 | 田中 商談テーブル (test.deal) id | person_id | customer | amount ----+-----------+----------+-------- 1 | 1 | XX商事 | 20000 2 | 3 | BB電機 | 10000 3 | 2 | ZZ不動産 | 2000 4 | 1 | RR証券 | 8000 期待している検索結果 name | amount | customer ------+--------+---------- 山田 | 20000 | XX商事 田中 | 10000 | BB電機 高橋 | 2000 | ZZ不動産 下記のようなSQLを書きました。 select distinct name,amount,customer from test.deal,test.person where person.id=deal.person_id order by amount desc  しかし、nameをdistinctしているにもかかわらず、結果は下記の通り、「山田」が重複しています。 name | amount | customer ------+--------+---------- 山田 | 20000 | XX商事 田中 | 10000 | BB電機 山田 | 8000 | RR証券 高橋 | 2000 | ZZ不動産 いろいろと調べて、group by を使えばいい、というようなやり方を示している例も多かったのですが、それもうまくいきません。(必要であれば載せます) 期待通りの結果を得るにはどのようなSQLを書けばよろしいでしょうか。 よろしくお願いいたします。

  • MYSQLであるレコードを取得したいのですが

    MYSQL5.0.33を使用しています。 今「ID(primary key)」「name」の二つのカラムのテーブルがあり、そのレコードの中から2の倍数と3の倍数のレコードをそれぞれ取得したいのです。 しかし、レコードが削除される可能性があり、なるべく均等に取得することができません。 ================= (例) 1 佐藤 2 鈴木 3 (削除されたレコード) 4 田中 5 小林 6 (削除されたレコード) 7 阿部 8 吉田 9 (削除されたレコード) ================= 上記のような状態ですと、3の倍数のレコードは一つも取得できません。 素人の感覚的な話になってしまうのですが、 ================= (例) 1 佐藤 2 鈴木 3 田中 4 小林 5 阿部 6 吉田 ================= このような感じにして、 「2の倍数は『鈴木』『小林』『吉田』」 「3の倍数は『田中』『吉田』」 で取得はできないものかと思い質問させて頂きました。 できなければ、何か方法や苦肉の策等ありましたらご教授頂けませんでしょうか。 どうか宜しくお願い致します!

  • replaceを使って更に重複レコード削除するには?

    下記のように空白除去、ソート、重複行削除を行いたいのですが、 なかなかうまくいきません。どなたか力を貸して下さい。 ----------------- name    | laptime ----------------- 山田太郎  | 50 鈴木 花子 | 20 山田 太郎  | 10 齊藤 二郎 | 60 山田 太郎  | 30 ------------------ ↓ ----------------- name    | laptime ----------------- 山田太郎  | 10 鈴木花子 | 20 齊藤二郎 | 60 ------------------ * laptime が小さい順 * nameの空白除去 * 空白除去後のnameの重複行削除(laptimeが一番小さいものを残す) 下記のようにSQL文を作って発行してみたのですが、 SELECT DISTINCT replace( replace( trim( name ) , ' ', '' ) , ' ', '' ) AS name_a, laptime FROM tyouhuku ORDER BY laptime ASC ----------------- name_a  | laptime ----------------- 山田太郎 | 10 鈴木花子 | 20 山田太郎 | 30 山田太郎 | 50 齊藤二郎 | 60 ------------------ と、空白削除とlaptimeソートまで出来てるのですが、重複行削除ができませんでした。 どなたかご助言、宜しくお願いします!

    • ベストアンサー
    • MySQL
  • テーブルごとのカウント

    PHP5.2+mysql 5.0.45で開発を行っております。 SQLに関する質問なのですが 以下のことが可能かどうかご教授いただきたく。 4つのテーブルがあります。 (例は適当です。項目の名称等は無視してください。) テーブルA ID Name Kana テーブルB ID NameID Pref City テーブルC ID NameID Tel Fax テーブルD ID NameID email CellPhone とします。 A.ID=1000の時各テーブルのレコード数が A:B:C:D=1:3:2:2となっています。 SQLの出力結果として A.ID A.Name A.Kana B.Count(ID) C.Count(ID) D.Count(ID) という、6項目を出力したいのですが 方法がわかりません。 試してみたのは select A.ID,A.Name,A.Kana,Count(B.ID),Count(C.ID),Count(D.ID) from A left join B on A.ID = B.NameID left join C on A.ID = C.NameID left join D on A.ID = D.NameID where A.ID = 1000 group by A.ID,A.Name,A.Kana ですが 結果、 A.ID = 1000 A.Name = Name A.Kana = Kana Count(B.ID) = 3 Count(C.ID) = 3 Count(D.ID) = 3 となってしまいます。 冷静に考えるとそうなんですが・・・ もしうまく結果を取得できる方法があればご教授いただきたく よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLで複数のSELECT文を1文にまとめたい

    以下のようなテーブル table1 があります。 ******************* table1 ******************* Name, Kyouka, Score, ID ******************* 山田, 国語, 92, 10001 鈴木, 国語, 71, 10002 田中, 国語, 89, 10003 山田, 数学, 65, 10004 鈴木, 数学, 69, 10005 杉田, 英語, 96, 10006 山田, 英語, 63, 10007 田中, 英語, 76, 10008 ... ******************* カラムIDはPRIMARYを指定しています。 カラムScoreはインデックスを作成しています。 このテーブルで、「IDと教科」を指定したときに、以下の2つのデータを得たいと思っています。 (1) IDに対応する名前と、その教科中の順位 (2) その教科のレコード数 具体例としては、例えば「ID=10001、教科=国語」を指定したときに、「山田、3人中1位」というような情報が得たいです。 (「ID=10001、教科=英語」のようなおかしな組み合わせは指定しないようになっています。) (1) は、以下のようにして名前と順位を得る事が出来ました。 SELECT Name, (SELECT COUNT(*) + 1 FROM table1 b WHERE b.Score > a.Score and Kyouka='国語') AS rank FROM table1 a WHERE ID='10001' ORDER BY Score DESC; (2)は、以下のようにして特定の教科のレコード数を得る事が出来ました。 SELECT COUNT(*) FROM table1 WHERE Kyouka='国語'; しかし、実際にはレコード数が大量にあり、頻繁にこの検索を実行する予定なので、負荷が心配です。 出来るだけサーバーの負荷を減らすために、1回のSELECT文の実行で(1)と(2)をどちらも実現できるような方法はないでしょうか。 また、このテーブルでインデックスを作成しているのはIDとScoreのみですが、より負荷を減らすにはKyoukaにもインデックスを作成した方が良いでしょうか。 何卒、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • Access 番号をつける方法

    お世話になっております。 access2010でクエリに番号を割り振ろうと思っています。 「ID」は昇順に並んでおり、同一の「ID」に対しての連番をつけたいです。 クエリ フィールド名:ID、名前 001 田中 001 佐藤 002 山田 003 鈴木 ☆完成図 フィールド名:番号、ID、名前 1 001 田中 2 001 佐藤 1 002 山田 1 003 鈴木 Accessでもexcelのcount関数を使うことはできるのでしょうか? それとも、DCountを使うのでしょうか? 2つ関数の使い方や、用途の違いがよくわかりません。 ご存知の方教えて下さい。よろしくお願いします。

  • EXCELで重複したデータの処理について

    氏名 | 点数 ----------- 山田 | ----------- 鈴木 | ----------- 小林 | ----------- 高橋 | ----------- 田中 | という表があるとします。 氏名 | 点数 ------------ 山田 | 80 ------------ 鈴木 | 100 ------------ 小林 | 70 ------------ 高橋 | 80 ------------ 田中 | 80 というように点数を入力すると 順位 | 名前 | 点数 ------------------- 1 | 鈴木 | 100 ------------------- 2 | 山田 | 80 ------------------- 2 | 高橋 | 80 ------------------- 2 | 田中 | 80 ------------------- 5 | 小林 | 70 のような表を自動的に作成できるようにしたいのですが、どうもうまくいきません。 順位と点数の並び替えは比較的簡単にできたのですが、それに対応した名前の並び替えがうまくできないのです。 VLOOKUP関数を使用して得点に対応した名前を表示させようとしたのですが、 順位 | 名前 | 点数 -------------------- 1 | 鈴木 | 100 -------------------- 2 | 山田 | 80 -------------------- 2 | 山田 | 80 -------------------- 2 | 山田 | 80 -------------------- 5 | 小林 | 70 となってしまい、80点の取得者が全て山田になってしまいました。 このような場合、どのようにすれば正常に並び替えを行うことができるのでしょうか。 言葉足らずで申し訳ありませんが、よろしくお願い致します。 OSはWindowsXP、ソフトはEXCEL2002を使用しています。