各投手の最後の試合のレコードを取得したいのですが、
下記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です。
よろしくお願いします。
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;
こんなかんじ?
日時同士での一致はできるかどうか試してないから文字列に変換しないといけないかもしれない。
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;
単体実行もエラーとなってしまい、
成功できませんでした。
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;
取れました!
ありがとうございます!!
こんな感じでは?
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
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
まで取れました。
別例出していただいたおかげで少し理解が進みました!
...と言いたいのですが難しい(^^;;
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正解でした。
ありがとうございます。
b-wind様!!
素早いご回答ありがとうございます!!
しかしながら、結果は
ID 3
ID 4
ID 5
ORDER BY id DESC;
とすれば 5, 4, 3の順で取得できますが、ID順ではなく、日付の降順で並べ替えたいのです。
ORDER BY max(created_at);
としてみたところ、
ID 3 浅い
しか取れませんでした。
サブクエリ(意味を理解できてません(TT;
単体実行もエラーとなってしまい、
成功できませんでした。