各phonenumberの最新データを抜き出す方法

このQ&Aのポイント
  • このSQL文では、各phonenumberごとの最新のデータを抜き出すことができます。
  • イメージ的には、各phonenumberに対して最新のデータのみを表示します。
  • これにより、データの重複を排除して最新の情報を把握することができます。
回答を見る
  • ベストアンサー

それぞれの最新データーを抜き出したい

| id | phonenumber |status | ----------------------- | 1 |1111111111111| OK | | 2 |2222222222222| OK | | 3 |3333333333333| NG | | 4 |1111111111111| NG | | 5 |2222222222222| OK | | 6 |3333333333333| OK | | 7 |1111111111111| NG | | 8 |1111111111111| OK | | 9 |3333333333333| NG | このようなSQL文があるとき、各phonenumberごとの最新のデーターを抜き出したいと思っています。 その時のSQL命令文を教えてください。 イメージ的には、 | 5 |2222222222222| OK | | 8 |1111111111111| OK | | 9 |3333333333333| NG | を抜き出すようなイメージになります。 ご教授お願いいします。

  • MySQL
  • 回答数5
  • ありがとう数0

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

  • ベストアンサー
回答No.1

SELECT id,phonenumber,status FROM テーブル名 T1 WHERE id=(SELECT MAX(id) FROM テーブル名 T2 WHERE T1.phonenumber=T2.phonenumber) です。

elkheart
質問者

補足

回答ありがとうございます。 テーブル名 T1とテーブル名 T2って言うのは、テーブルを2つ用意するってことですか? 素人なんで分かりません。 詳しく教えてください。 お願い致します。

その他の回答 (4)

回答No.5

今回の質問ではstatusも表示対象なので、少し厄介なSQLとなっています。 statusを表示しないのであれば次のようなSQLとなります。 SELECT MAX(id),phonenumber FROM テーブル名 GROUP BY phonenumber ORDER BY 1 このSQLのstatusを追加した場合、そのstatusは何を表示するのか未定となり、通常はエラーとなります。(ただし、MySQLの場合はエラーとならないようです) つまり、GROUP BY以下に無い列はMAX等の集計関数を使用しないと文法上おかしな事になります。 そこで最初のテーブルでstatusも含めて対象行を表示します。 WHERE以下が無い場合は、当然全て表示されてしますので、ここで同じphonenumberを持つ 「WHERE T1.phonenumber=T2.phonenumber」行で最大のidを持つ「MAX(id)」idに一致する「WHERE id=(...)」行のみを選択させます。

回答No.4

>テーブルを2つ用意するってことですか? T1とT2は同じテーブルです。T1とT2は別名で列名の先頭に付けてどちらのテーブルの列名かを区別します。 SELECTでテーブルの検索結果を表示しますが、同じphonenumberでidが一番大きな行を条件とするためT2で同じテーブルを使ってidが一番大きな値を検索する事で目的の結果が出せます。

elkheart
質問者

補足

ありがとうございます。 見事にできました!! でも何で抽出できるかは???です。 よろしければ詳しく教えてください。 >同じphonenumberでidが一番大きな行を条件とするためT2で同じテーブルを使ってidが一番大きな値を検索する事で目的の結果が出せます。 ここが特に?です。 素人にも分かるように教えてください。 お願いします。

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

こういう書き方もありますね SELECT id,phonenumber,status FROM allingstatus WHERE (id,phonenumber) IN (SELECT MAX(id),phonenumber FROM allingstatus GROUP BY phonenumber)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

横から失礼します。 T1とは、テーブル1の「別名(エイリアス)」です。 SQL文の記述を見やすくするためなどに用います。今回は AS を省略しますね。 SELECT テーブル1.id, テーブル1.phonenumber, テーブル1.status FROM テーブル1 (以下略) でもいいけど、記述誤りも生じるでしょうし。 また、「別名(エイリアス)」は、列名やテーブル名として使用することもあります。 副問い合わせする場合に用います。

elkheart
質問者

補足

回答ありがとうございます。 と言うことは、テーブル名が「callingstatus」としたら SELECT id,phonenumber,status FROM allingstatus T1 WHERE id=(SELECT MAX(id) FROM allingstatus T2 WHERE T1.phonenumber=T2.phonenumber) になるってことでしょうか?

関連するQ&A

  • 最新の日付と2番目の日付のデータ取得方法

    SQL Server 2008 にて下記条件を満たしたデータの取得を行いたいです。 ・IDごとに、日付がある日以前で最新のものとその次の日付のデータ2件 ・ただし、その2件で価格が変わらなければ価格変動のあった日付のデータまでさかのぼる ・価格が同じデータの場合、古い日付のデータを取得 例: ・条件…日付が20040101以前 <検索対象データ> ID  日付    価格 ------------------------ 1   20000101   100 1   20010201   100 1   20020301   200 2   20020401   300 2   20000501  400 2   20010601   400 2   20030701   300 3   20000801   500 3   20010901  600 3   20040901  600 <取得したい結果> ID  日付    価格 ------------------------ 1   20020301   200 1   20000101   100 2   20020401   300 2   20000501  400 3   20010901  600 3   20000801   500 なるべく少ないSelect文で取得したいと考えております。 よろしくお願いします。

  • MySQLで最新のデータから一回ずつ順番に取り出す方法 PHP

    idと、dataという2つのカラムで構成されたMySQLがあります。 そのidはプライマリキーに設定してあり、auto incrementとして、どんどん数値が増えていく設定です(phpMyAdminを使ってテーブルを作っています) そこで、そのid番号の現在の最新のものを php側から呼び出して取得し、 その次、しばらくすると、PHP側で再びその最新から2番目 (2番目に新しいデータ)を取得する命令を 投げたいと思っています。 そのあとは、同じように、3番目に新しいもの、 4番目、5番目と続けたいと思っています。 その際、毎回、php側で MySQLのデータの読み出し命令を送るわけですが、 その際、最新のもの、2番目に最新のものを 時間差でSELECTしていくには、 どのようにすればいいでしょうか。 PHP側で「いま3番目に新しいものを読んだので次は4番目に新しいもの」というように前回の状態を保持しておくことってできるのでしょうか。 また、このidというのは、途中で消したりしているidもあったりするので、1番から始まっていたとしても、途中の30番とかが抜けていたりして、歯抜け状態ですので、id番号でセレクトするとエラーになる可能性が高いです。 なので、id番号ではなく、 テーブルの上の行から選んでいくという方法が ベストだと思っています。 そのような指定をMySQLの構文で指定することって可能なのでしょうか? ちなみに、一応、何番のidを読むというのは理解しており、 以下のような感じのSELECT文をphpのqueryで使っていたりします。 table_aから、変数$indexNumの値のidを読むという処理を、 変数$queryに入れている文が以下になります。 $query = "SELECT arrayset FROM `table_a` WHERE id= '$indexNum'"; このあたりのノウハウをご存知の方、教えてくださいますと幸いです。 お願いいたします。

    • ベストアンサー
    • MySQL
  • 連続したデータを条件とするSQL文の書き方

    下記のようなデータを扱っております。 ID | Point 1 | 10 2 | 20 3 | 30 4 | 20 5 | 30 6 | 10 7 | 20 8 | 30 9 | 30 上記データにおいて、Pointが10,20,30と連続している時の Pointが30でのID値を取得するSQL文が分かりません。 上記データであれば、ID3と8が条件に合致しており、取得したいID値となります。 ID5や9はPointが30ですが、『Pointが10,20,30と連続している』という条件に合致していない為、取得したいID値ではありません。 これを叶えるSQL文を教えて頂けないでしょうか。 (SQLiteを使用しています。)

  • 一致したデータ同士を文字列で繋げるには?

    何か方法があれば教えて頂きたのです。 SQLで一致したデータの項目同同士を繋げることができるかどうか。 具体的には以下のような。 ID   名前 ------------ A1 SQL A1 My A2 Server のような結果が出るようなSQL文を作ったとして ID   名前 ------------ A1 SQL,My A2 Server みたいな同じIDの名前を例のようなカンマとかスラッシュ 等を間に入れてつなげていくなんてことできますか? 実際にはSQL文で出たデータを各配列にそれぞれデータに入れて使う のでSQL文の中で仮に出来なくても結果に対してそのようにつなげることが可能かどうか。

    • ベストアンサー
    • MySQL
  • メインデータと最新サブデータのテーブル結合について

    お世話になっております。 MySQL4.1にて以下のようなデータを取得したいと考えています。 1回のSQLで何とかとりたいと考えているのですが、 良いお知恵はないでしょうか? ▼Aテーブル ID(PK) メインメモ ▼Bテーブル ID(PK) 日付(PK) サブメモ ▼取得したい結果 ID(1) メインメモ 最新サブメモ ID(2) メインメモ 最新サブメモ ID(3) メインメモ null ・「メインメモ」と「サブメモ」は1対多の状態です。 ・IDごとに1行だけメインメモと最新のサブメモを取得したい。 ・サブメモがなくてもメインメモだけでも取れる。  (Aテーブル LEFT OUTER JOIN Bテーブルの関係) 上記の条件でデータを取得したいと考えております。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 特殊な?日付データ条件のSELECT文で困っています。回答御願いします。

    すいません。初心者のSQL構文の質問です。 データベースはSQLServer2005です。 ID | 履歴 | 有効日付 100 | 1 | 2009/5/15 100 | 2 | 2009/7/15 100 | 3 | NULL(最新データ) 200 | 1 | NULL(最新データ) のようなテーブルがあります。 データ履歴を作成するたびに有効日付には指定した日付が入ります。 作成した最新のデータには有効日付にはNULLが入るようになってます。 有効日付はdate型です。 このテーブルでのSELECTで 例えば、 2009/6/15と入力された時(条件)には 結果: 2 |2009/7/15 2009/7/15と入力された時(条件)には 結果: 2 |2009/7/15 2009/7/16と入力された時(条件)には 結果: 3 |NULL(最新データ) という結果を取得したいのです。 どなたか詳しい方のご教授をよろしくお願い致します。

  • 最新データ取得

    いつもお世話になります。 Access 2007のコードを教えていただきたいです。 Access で社員単価管理を作成しています。 クエリで社員の単価を計算させて、日報フォームに表示させることができました。以下のコードで If Not IsNull(Me![個人ID]) Then Me![工数単価] = DLookup("日給", "Q_社員別給与最新日付", "[個人ID]=" & Me![個人ID]) End If 社員の単価は上がる場合がありますので、社員単価入力テーブルから最新の日付のデータを取得するため、クエリを作成しました。 これでうまく行くと思ったら、問題発生しております。 日報フォームのデータを修正する時、最新日付の単価も変わってしまいます。 うまく説明できないですので、以下のようです 社員単価入力テーブル 日付     個人ID 原価金額 20110401   01    6400 20110701   01    8000 日報フォーム 日付    個人ID 出勤時間 退勤時間 工数 残業 日給 20110630   01    8:00    18:00    1   1  7200   20110701   01    8:00    17:00    1   0  8000 データ修正後 日付     個人ID 出勤時間 退勤時間 工数 残業 日給 20110630   01    8:00    17:00    1   0   8000 データ修正後に表示してほしいのは 日付   個人ID 出勤時間 退勤時間 工数 残業 日給     20110630  01   8:00     17:00   1   0   6400 つまり、 社員単価入力テーブルの日付<日報フォームの日付なら、最新の日付のデータで計算してほしいです。そうではない場合、最新日付より前のデータで計算するというコードが書きたいですが、どういう風にに書けばいいか全く、わかりません 教えて下さい。 よろしくお願いします。

  • 同じデータが結果として出てくるので困ってます

    他人が作ったものを修正中です。 現在↓ カラム ID NO1 NO2 NO3     1  12 23 34 2 12 3 12 23 $sql="SELECT ID FROM `SHOPLIST`"; $db = mysql_query($sql); while($db2 = mysql_fetch_array($db)){ ・・・・省略 } 結果抽出データは 1 1 1 2 3 3 なぜか6件です。 NO1,NO2,NO3に値が入っている数と重複するデータ数が同じです。 現在はif文を使ってIDが同じものは処理しないという動きです。 これをif文を使わずに、MySQLだけでIDが同じものは抽出しないと いうことはできるのでしょうか。 考え方だけでも教えて頂きたいです、宜しくお願い致します。   

  • データの間隔が知りたい時

    10面体のサイコロを2個を振ってデータを入力しています。 結果が以下のようになったとします。 (kai=回数,dice1=サイコロ1,dice2=サイコロ2) kai dice1 dice2 --+------+------ 5回  1  5 ←最新回 4回  3  8 3回  5  9 2回  1  7 1回  10  5 ---------------- とあった時、dice1の1は3回ぶりに出ていますので、ここで3回と 間隔を表示したいのですが間隔を出すSQL文の立て方に悩んでいます。 またdice2の5は1回目に出ていますが、3回目にdice1で5が出ていますので この場合は2回と表示したいのですが。 間隔をつかみつつ、なおかつ2つの要素を比較しながらその間隔を導く というSQL文はどういった構造になるのでしょうか? お詳しい方、参考サイトなどでも結構ですのでご教授宜しくお願いい致します。

  • MySQLで顧客毎に最新のデータ順で表示

    以下のようなデータがあります。 id 顧客コード 日付 金額 1 A001 2012/12/25 100 2 B001 2012/12/24 200 3 A001 2012/12/24 100 4 C001 2012/12/23 500 5 A001 2012/12/23 300 6 B001 2012/12/23 100 このデータを、顧客毎に最新順で表示したいのです。 順番は、 1.最新の日付順に顧客がまず並ぶ 2.その顧客の並び順で、顧客毎に日付が新しい順に各データが並ぶ 説明が下手ですが、下の様に 1 A001 2012/12/25 100 3 A001 2012/12/24 100 5 A001 2012/12/23 300 2 B001 2012/12/24 200 6 B001 2012/12/23 100 4 C001 2012/12/23 500 A001、B001、C001の中で、最新の日付を持っているのがA001→B001→C001なので、その順で並ぶ。 (SELECT 顧客コード, MAX(日付) FROM tbl GROUP BY 顧客コード かな?) さらに、その顧客の中で日付順にデータが並ぶ。 このように抽出するには、どのようなSQL文で行うのでしょうか。 サブクエリを使うのかなとは思うのですが、あまり理解できていないため思いつきません。 わかるかたよろしくお願いします。

    • ベストアンサー
    • MySQL