SQL文の使い方とテーブルから日付順にIDを取得する方法

このQ&Aのポイント
  • SQL文を使用して、テーブルから日付順にIDを取得する方法について教えてください。
  • データを表示するためのSQL文が分からず悩んでいます。テーブルから各IDを10件まで日付順に取り出すことは可能でしょうか。
  • 具体的には、1つのページに10件までの日付順で並んだIDのデータを表示したいです。IDごとにまとめられ、最も新しい日付のデータが上に表示されるようにしたいです。
回答を見る
  • ベストアンサー

SQL文を教えてください

いつもお世話になっております。 ウェブサイトを作っているのですが、以下のようなデータを表示するのに良いSQL文が分からず悩んでいます。 ID | DATE     | DATA --+----------+----- 1 | 2010-11-11 | aaa 2 | 2010-11-11 | bbb 1 | 2010-11-10 | ccc 3 | 2010-11-12 | ddd 3 | 2010-11-11 | eee 4 | 2010-11-10 | fff 1 | 2010-11-12 | ggg 2 | 2010-11-12 | hhh 1 | 2010-11-12 | iii 3 | 2010-11-12 | jjj 1 | 2010-11-09 | kkk 1 | 2010-11-09 | lll 1 | 2010-11-08 | mmm 1 | 2010-11-08 | nnn 1 | 2010-11-07 | ooo 1 | 2010-11-07 | ppp 1 | 2010-11-06 | qqq 3 | 2010-11-05 | rrr 2 | 2010-11-13 | sss 5 | 2010-11-08 | ttt 6 | 2010-11-05 | uuu 7 | 2010-11-04 | vvv 8 | 2010-11-03 | www 9 | 2010-11-02 | xxx 10| 2010-11-01 | yyy 11| 2010-10-30 | zzz 上のようなテーブルから、各IDを10件まで日付順に取り出すことはできるでしょうか? 具体的には、1つのページに以下のように表示したいのです。 2 | 2010-11-13 | sss 2 | 2010-11-11 | bbb 1 | 2010-11-12 | ggg 1 | 2010-11-11 | aaa 1 | 2010-11-10 | ccc 1 | 2010-11-12 | iii 1 | 2010-11-09 | kkk 1 | 2010-11-09 | lll 1 | 2010-11-08 | mmm 1 | 2010-11-08 | nnn 1 | 2010-11-07 | ooo 1 | 2010-11-07 | ppp 3 | 2010-11-12 | ddd 3 | 2010-11-11 | eee 3 | 2010-11-05 | rrr 4 | 2010-11-10 | fff 5 | 2010-11-08 | ttt 6 | 2010-11-05 | uuu 7 | 2010-11-04 | vvv 8 | 2010-11-03 | www 9 | 2010-11-02 | xxx 10| 2010-11-01 | yyy ・各IDのうち、最も新しい日付のものが上にくる ・表示するIDは10件まで ・表示はIDごとにまとめて行う ・一つのIDに属するデータは10件までしか取り出さない 上記のことを実現する方法をご教授ください。 よろしくお願い致します。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.3

補足です。 WHERE句のサブクエリに LIMIT を使うと下記の様に出来ますね。 リレーショナル演算子ではない ORDER BY / LIMIT を検索条件に入れるのは、ちょっときたない感じがしますが。 SELECT * FROM hoge_tbl a WHERE date IN (SELECT date FROM hoge_tbl b WHERE a.id = b.id ORDER BY date DESC LIMIT 10) AND id IN (SELECT id FROM hoge_tbl c GROUP BY id ORDER BY MAX(date) DESC LIMIT 10) ORDER BY (SELECT MAX(date) FROM hoge_tbl e WHERE a.id = e.id) DESC, id, date DESC, data

bulldozerQ
質問者

お礼

お礼が遅くなって申し訳ありません。 質問したSQL文の件は、無理があってダメなんだろうとほとんどあきらめていたのですが、実現でき感激しております。 サブクエリーをうまく使うことで、通常ではできないようなこともなんとかなってしまうのですね。 感謝してもしきれません。 本当にありがとうございました。

その他の回答 (2)

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

> できればデータすべてを取り出すのではなく、 > 必要な数だけ取り出すようにしたいところです。 かなり強引ですが、下記の様にすればできるとは思います。 ただし、MySQL では未確認です。 SELECT * FROM hoge_tbl a WHERE (SELECT COUNT(*) FROM hoge_tbl b WHERE a.id = b.id AND a.date < b.date) < 10 AND (SELECT COUNT(*) FROM ( SELECT id FROM hoge_tbl c GROUP BY id HAVING MAX(date) > (SELECT MAX(date) FROM hoge_tbl d WHERE a.id = d.id) ) tmp) < 10 ORDER BY (SELECT MAX(date) FROM hoge_tbl e WHERE a.id = e.id) DESC, id, date DESC, data

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

「表示するIDは10件まで」以外のことは、下記の様なSQLで出来るかと。 ただし、MySQL では未確認です。 SELECT * FROM hoge_tbl a WHERE (SELECT COUNT(*) FROM hoge_tbl b WHERE a.id = b.id AND a.date < b.date) < 10 ORDER BY (SELECT MAX(date) FROM hoge_tbl c WHERE a.id = c.id) DESC, id, date DESC, data ;

bulldozerQ
質問者

お礼

お礼が遅くなり申し訳有りませんでした。 お答えいただきどうもありがとうございます。 やはり上記のような条件では「表示するIDは10件まで」にするのは難しいのでしょうか。 お教えいただいた例をもとにLIMIT句を付け加えてみましたが、うまくいきませんでした。 やはり、できればデータすべてを取り出すのではなく、必要な数だけ取り出すようにしたいところです。 もう少し自分で考えてみます。 ありがとうございました。

関連するQ&A

  • PerlでCSV形式のファイルの一部分だけを抽出する方法

    Perlをやっていて困っていることがあります。 CSV形式のファイルを開いて、変数に代入した後の処理がわかりません。 どのようにしたいかというと・・・ aaa,bbb,ccc,ddd,eee,fff ggg,hhh,iii,jjj,kkk,lll mmm,nnn,ooo,ppp,qqq,rrr sss,ttt,uuu,vvv,www,xxx yyy,zzz,111,222,333,444 というファイルを読み込んだとします。その後 'fff' の部分だけをスカラー変数に取り込みたいときにはどのような 関数を実行すればいいのでしょうか。 困っています、お願いします。

    • ベストアンサー
    • Perl
  • csv形式のデータの一部を削除して、上書きする方法

    前回も似たような(?)質問をしたんですが 今回も質問させてください。CSVに関して(CSVだけというわけではありませんが) 以下のようなデータを読み込んで、配列変数に格納後... aaa,bbb,ccc,ddd eee,fff,ggg,hhh iii,jjj,kkk,lll mmm,nnn,ooo,ppp qqq,rrr,sss,ttt ↑のデータを、下のようなデータにして、保存しなおすにはどうすればよいでしょうか。(上から二列目を削除して前のデータに保存しなおす) aaa,bbb,ccc,ddd iii,jjj,kkk,lll mmm,nnn,ooo,ppp qqq,rrr,sss,ttt 変な質問でもうしわけございませんが、回答できるかたお願いします。

    • ベストアンサー
    • Perl
  • centerタグを使わないで中央よせ

    画像のようなレイアウトがしたいです。 centerタグを使って以下の様に書きました。 <html> <head> <meta http-equiv='Content-Style-Type' content='text/css'> <style> .text100 { width: 100; text-align: left; } </style> </head> <body> <center> <img src='./picture.jpg'> <p class='text100'> aaa bbb ccc eee fff ggg hhh iii jjj kkk lll mmm nnn ooo ppp qqq rrr sss ttt uuu vvv www xxx yyy zzz </p> </center> </body> <html> しかしcenterタグは非推奨との事なので、これをcenterタグを使わないで書くのはどうしたらよいでしょうか? やりたいことは画像は中央に、文章は幅100pxの中で左よせ、なのだけど、文章の固まりとしては中央に置きたいのです。 よろしくお願いいたします。

    • ベストアンサー
    • CSS
  • SQL 複数条件を設定

    使用言語はjavaで処理しており、 SQL Server2005にて下記のようなテーブル(T_Kekka)があります。    ID   a-1   a-2   b-1   b-2   c-1   c-2     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd    ccc   eee   fff       2   ggg   bbb   ccc     hhh   iii    jjj       3   bbb   mmm   ddd   ccc   fff    eee       4   bbb   aaa   ccc    ddd   qqq   rrr       5   zzz   sss   ttt     ccc   vvv   xxx       6   zzz   aaa   ttt     ccc   vvv   fff       7   zzz   zzz   zzz     zzz   zzz    zzz       8   qqq   rrr   ccc     ddd   fff    eee    検索する値は下記の通りです。 検索値 |a-1|a-2|b-1|b-2|c-1|c-2|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |aaa|bbb|ccc|ddd|eee|fff| 期待値としては、aはaのグループで検索、bはbのグループで検索、cはcのグループで検索をし、 一致個数の多い順に出力したいと考えております。(理想は下記のような感じです。) また、グループ内であれば逆転していてもOKです。 (例えばID:1のaグループのような感じです。) *1 一致数が同じ場合はcグループの数が多いデータが最優先となり、その他はID順になります。 期待値    ID   a-1   a-2   b-1   b-2   c-1   c-2   一致数  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd   ccc   eee   fff     6    3   bbb   mmm   ddd   ccc   fff    eee    5    8   qqq   rrr    ccc   ddd   fff    eee    4・・・*1    4   bbb   aaa   ccc   ddd   qqq   rrr     4    6   zzz   aaa   ttt    ccc   vvv    fff     3    2   ggg   bbb   ccc   hhh   iii     jjj      2    5   zzz   sss   ttt    ccc   vvv    xxx     1    7   zzz   zzz   zzz    zzz   zzz    zzz     0 知識不足のため私には複雑すぎて悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。 また、まだテスト段階なので現状のようなテーブル構造にしてしまいましたが、 他のテーブル構造の方がデータが抽出しやすかったり、レスポンスがいい場合がありましたら、 ご教授いただけると助かります。 説明が分かりづらく表が見づらくて申し訳ございませんが、 宜しくお願い致します。

  • セルの数字を抽出して一列にする方法を教えてください

    下記のような結果を出したいのですが、 関数を教えていただけませんでしょうか。 ※1はaaaとbbbがあるので、それをまとめてaaabbbとしたいです。 イメージとしてはCONCATENATEのような。 ●元データ 1 aaa 1 bbb 2 fff 2 ggg 2 hhh 3 iii 3 jjj 3 kkk 3 lll 3 mmm 3 nnn 4 ooo 5 ppp 5 qqq ●完成 1 aaabbb 2 fffggghhh 3 iiijjjkkklllmmmnnn 4 ooo 5 pppqqq よろしくお願いいたします。

  • EXCEL97のマクロ処理について

    EXCEL97のマクロ処理について教えてください。 下記のシート例のようなシート(アクセスのクロス集計のようなもの)を最初に複数範囲指定(アクティブ)します。その後にその範囲指定したなかで項目が1~5まで全て同じモノだけを統一して、種類で存在するものも統一させます。一つ目のものに種類1がなくても同一のものに種類1があれば統一後のデータは種類1の列に"1"がつくようにします。ちなみに種類はその時によりどれだけ存在するかわからないのが前提です。削除するデータは回路Noが大きいものを消すようにします。下がそのデータの例です。 =============== エクセルシート例 =================================== 回路No  項目1 項目2 項目3 項目4 項目5 種類1 種類2 種類3 ... 1      AAA  BBB  CCC   DDD  EEE   1        1 1      FFF  DDD  UUU   DDD  OOO       1    1 1      UUU  PPP  TTT   DDD  EEE   1   1 2      AAA  BBB  CCC   DDD  EEE       1    1 2      XXX  QQQ  SSS   NNN  MMM   1   1                ↓ マクロ処理後 回路No  項目1 項目2 項目3 項目4 項目5 種類1 種類2 種類3 ... 1      AAA  BBB  CCC   DDD  EEE   1   1    1 1      FFF  DDD  UUU   DDD  OOO       1    1 1      UUU  PPP  TTT   DDD  EEE   1   1 2      XXX  QQQ  SSS   NNN  MMM   1   1 ================================================================== シート選択後ボタンによりマクロ処理されるように考えています。どうか宜しくお願い致します。

  • EXCEL VBA split関数について

    Excel VBA初心者です。 split関数についてどなたか教えていただけないでしょうか。 aaa,bbb,ccc,eee fff,ggg,hhh,iii jjj,kkk,lll,mmm というデータがあるとして、そこから aaa bbb fff ggg jjj kkk これだけ(左から2個分)を抜き取りたいのですが可能でしょうか? カテ違いな質問でしたらスミマセン。

  • スペース区切りのテキストデータ

    VB2005.netを使っています。 スペース区切りの2つのテキストデータが 2つのTEXTBOX内あります。 AA BBB CCC DD EEE FF GGG HHH II JJJ AA LLL MMM NN OOO FF QQQ RRR SS TTT このAAの列とCCC列を抜き出して表示させ、 AA CCC-MMM FF HHH-RRR といった計算の後の数字を行にして表示 させたいのですが、何かよい方法があるでしょうか? よろしくお願いします!

  • awkで、空欄箇所を埋めたい

    awkを使って、下記処理前データを処理後データの形式 にしたいのですが、上手いやり方が分かりません。 宜しくお願いいたします。 ■処理前データ ABC 12345 MMM NNN PPP QQQ EFG 6789 RRR SSS TTT ■処理後データ ABC 12345 MMM ABC 12345 NNN ABC 12345 PPP ABC 12345 QQQ EFG 6789 RRR EFG 6789 SSS EFG 6789 TTT

  • 2つの区分で並び替えたい

    EXCEL2010 下記の様な並び替えをする方法について教えていただきたく。 A列にA,B,Cといった文字列データがA,Bの場合とA,B,Cの場合で配置されます。 また、別の文字列データでRRR,SSS,TTT,UUU,VVVのデータが 最少5つ。最大9でRRR~ZZZまで配置されます。 両者はランダムに配置されています。 A~Cのデータはひとまとめ。 RRR~ZZZまでのデータもひとまとめでB列に配置したいです。 最初のデータ群で3つ目のデータが無ければ空欄にします 尚、 A~Cの末尾は同じ文字列が入っています。実が入ります。 例1 A列    B列 A実    A実 RRR    B実 SSS TTT    RRR B実    SSS UUU    TTT VVV    UUU       VVV 例2 A列    B列 A実    A実 RRR    B実 SSS    C実 TTT    RRR B実    SSS UUU    TTT C実    UUU VVV    VVV WWW   WWW というイメージにしたいのです。 元々A列にある並びはそのまま。 A列に配置されたデータに対し、 最初のデータ群を3つのかたまりでひとまとめ、 末尾が実を最初に表示するにする構成です。 フラグを立てて末尾が実を先頭に持ってくるまでは出来そうですが、 3つ目が無い場合に空欄にする処理で悩んでいます。 関数でもVBAでもどちらでも構いません。 よろしくお願いします。