人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【SQL】先着1名様100pt 下記SQLどこを修正すれば良いでしょうか?

各投手の最後の試合のレコードを取得したいのですが、
下記SQLでは最初の試合のレコードが取れてしまいます。

* 500文字以内制限に引っかかったのでコメント欄にサンプルデータを書きます。

-- レコード挿入
INSERT INTO `pitch` VALUES(1, '2008-01-01', '岩熊', 'ソフトバンク', '●');
INSERT INTO `pitch` VALUES(2, '2008-02-02', '田中', 'ソフトバンク', '●');
INSERT INTO `pitch` VALUES(3, '2008-03-03', '浅い', '上層学院', '○');
INSERT INTO `pitch` VALUES(4, '2008-04-04', '田中', 'オリックス', '○');
INSERT INTO `pitch` VALUES(5, '2008-05-05', '岩熊', '値弁和歌山', '○');

-- これでは最初の試合が返される。
SELECT *
FROM `pitch`
GROUP BY `name`
ORDER BY max( `created_at` ) DESC
;

↑のSQLの結果は、
ID 1 (岩熊の最古)
ID 2 (田中の最古)
ID 3
が返されます。

ID 5 (岩熊の最新がほしい)
ID 4 (田中の最新がほしい)
ID 3
が返されるSQLはどう書けば良いのでしょうか?

データベースはMySQL 5です。

よろしくお願いします。

●質問者: radio3
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:2008-01-01 GROUP Max MySQL name
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● b-wind
●10ポイント ベストアンサー
SELECT * FROM pitch p1
 WHERE created_at = ( 
 SELECT max(created_at) FROM pitch p2
 WHERE p1.name = p2.name
 GROUP BY p2.name
 )
ORDER BY id;

こんなかんじ?


日時同士での一致はできるかどうか試してないから文字列に変換しないといけないかもしれない。

◎質問者からの返答

b-wind様!!

素早いご回答ありがとうございます!!

しかしながら、結果は

ID 3

ID 4

ID 5

ORDER BY id DESC;

とすれば 5, 4, 3の順で取得できますが、ID順ではなく、日付の降順で並べ替えたいのです。

ORDER BY max(created_at);

としてみたところ、

ID 3 浅い

しか取れませんでした。

サブクエリ(意味を理解できてません(TT;

単体実行もエラーとなってしまい、

成功できませんでした。


2 ● kn1967
●100ポイント
SELECT *
FROM pichi AS T1
WHERE NOT EXISTS(SELECT * FROM pitch AS T2 WHERE T2.name = T1.name AND T2.created_at > T1.created_at)
ORDER BY created_at DESC;
◎質問者からの返答

取れました!

ありがとうございます!!


3 ● chuken_kenkou
●10ポイント

こんな感じでは?

select
 *
 from `pitch` as x
 where id=(select max(id)
 from `pitch`
 where x.`name`=`name`
 order by id desc
◎質問者からの返答

すみません。構文エラーと出ました。

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 7


4 ● b-wind
●100ポイント

ID順ではなく、日付の降順で並べ替えたいのです。

見落としてました。


せっかくなのでちょっと趣向を変えて。

SELECT * FROM pitch p1
 WHERE created_at >= ANY ( 
 SELECT created_at FROM pitch p2
 WHERE p1.name = p2.name
 GROUP BY p2.name
 )
ORDER BY created_at DESC

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.2.3 ANY、IN、SOME とともに使用したサブクエリ

これなら日付け型であることも問題ないはず。


サブクエリ(意味を理解できてません(TT;

単体実行もエラーとなってしまい、

外側のテーブルとくっつけてるから、単体実行は無理ですね。

◎質問者からの返答

ありがとうございます。

#1

ORDER BY created_at DESC;

とするだけでOKでした。

なぜmax()してしまったのか... すみません。

ありがとうございました。

#2

ID 5

ID 4

ID 3

ID 2

ID 1

まで取れました。

別例出していただいたおかげで少し理解が進みました!

...と言いたいのですが難しい(^^;;


5 ● chuken_kenkou
●10ポイント

ID順ではなく、日付の降順で並べ替えたい

created_at列の値は、必ずしも昇順(新しい日付順)で格納されないのでしょうか?

select 
 *
 from pitch as x
 where created_at=(select max(created_at)
 from pitch
 where x.name=name)
 order by created_at desc
◎質問者からの返答

>created_at列の値は、必ずしも昇順(新しい日付順)で格納されないのでしょうか?

その通りなのです。

SQL正解でした。

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ