こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

| 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 |

を抜き出すようなイメージになります。

ご教授お願いいします。

投稿日時 - 2012-01-22 13:37:06

QNo.7259643

すぐに回答ほしいです

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

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

投稿日時 - 2012-01-22 14:35:13

補足

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

投稿日時 - 2012-01-22 15:13:59

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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=(...)」行のみを選択させます。

投稿日時 - 2012-01-23 10:32:28

ANo.4

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

投稿日時 - 2012-01-22 20:25:17

補足

ありがとうございます。
見事にできました!!

でも何で抽出できるかは???です。
よろしければ詳しく教えてください。

>同じphonenumberでidが一番大きな行を条件とするためT2で同じテーブルを使ってidが一番大きな値を検索する事で目的の結果が出せます。

ここが特に?です。
素人にも分かるように教えてください。
お願いします。

投稿日時 - 2012-01-22 22:27:56

ANo.3

こういう書き方もありますね

SELECT id,phonenumber,status
FROM allingstatus
WHERE (id,phonenumber) IN (SELECT MAX(id),phonenumber
FROM allingstatus
GROUP BY phonenumber)

投稿日時 - 2012-01-22 17:03:41

ANo.2

横から失礼します。

T1とは、テーブル1の「別名(エイリアス)」です。
SQL文の記述を見やすくするためなどに用います。今回は AS を省略しますね。

SELECT テーブル1.id, テーブル1.phonenumber, テーブル1.status
FROM テーブル1 (以下略)
でもいいけど、記述誤りも生じるでしょうし。

また、「別名(エイリアス)」は、列名やテーブル名として使用することもあります。
副問い合わせする場合に用います。

投稿日時 - 2012-01-22 15:52:39

補足

回答ありがとうございます。
と言うことは、テーブル名が「callingstatus」としたら

SELECT id,phonenumber,status
FROM allingstatus T1
WHERE id=(SELECT MAX(id)
FROM allingstatus T2
WHERE T1.phonenumber=T2.phonenumber)

になるってことでしょうか?

投稿日時 - 2012-01-22 16:03:44