- ベストアンサー
各phonenumberの最新データを抜き出す方法
- このSQL文では、各phonenumberごとの最新のデータを抜き出すことができます。
- イメージ的には、各phonenumberに対して最新のデータのみを表示します。
- これにより、データの重複を排除して最新の情報を把握することができます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
SELECT id,phonenumber,status FROM テーブル名 T1 WHERE id=(SELECT MAX(id) FROM テーブル名 T2 WHERE T1.phonenumber=T2.phonenumber) です。
その他の回答 (4)
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
今回の質問では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=(...)」行のみを選択させます。
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
>テーブルを2つ用意するってことですか? T1とT2は同じテーブルです。T1とT2は別名で列名の先頭に付けてどちらのテーブルの列名かを区別します。 SELECTでテーブルの検索結果を表示しますが、同じphonenumberでidが一番大きな行を条件とするためT2で同じテーブルを使ってidが一番大きな値を検索する事で目的の結果が出せます。
補足
ありがとうございます。 見事にできました!! でも何で抽出できるかは???です。 よろしければ詳しく教えてください。 >同じphonenumberでidが一番大きな行を条件とするためT2で同じテーブルを使ってidが一番大きな値を検索する事で目的の結果が出せます。 ここが特に?です。 素人にも分かるように教えてください。 お願いします。
- yambejp
- ベストアンサー率51% (3827/7415)
こういう書き方もありますね SELECT id,phonenumber,status FROM allingstatus WHERE (id,phonenumber) IN (SELECT MAX(id),phonenumber FROM allingstatus GROUP BY phonenumber)
- bin-chan
- ベストアンサー率33% (1403/4213)
横から失礼します。 T1とは、テーブル1の「別名(エイリアス)」です。 SQL文の記述を見やすくするためなどに用います。今回は AS を省略しますね。 SELECT テーブル1.id, テーブル1.phonenumber, テーブル1.status FROM テーブル1 (以下略) でもいいけど、記述誤りも生じるでしょうし。 また、「別名(エイリアス)」は、列名やテーブル名として使用することもあります。 副問い合わせする場合に用います。
補足
回答ありがとうございます。 と言うことは、テーブル名が「callingstatus」としたら SELECT id,phonenumber,status FROM allingstatus T1 WHERE id=(SELECT MAX(id) FROM allingstatus T2 WHERE T1.phonenumber=T2.phonenumber) になるってことでしょうか?
補足
回答ありがとうございます。 テーブル名 T1とテーブル名 T2って言うのは、テーブルを2つ用意するってことですか? 素人なんで分かりません。 詳しく教えてください。 お願い致します。