• ベストアンサー

SQLの相談

SQLの相談です。 以下のようなテーブルについて CREATE TABLE `record`( `id` INT, `timestamp` TIMESTAMP, `point` INT ); 1) id毎に最新5件のデータを抽出 2) 合計pointが420以上のidだけを抽出 したいのですが…。 1)の処理について、うまい解決策を思いつきません。 助言をお願いします。

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

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

DBの種類がわかりませんので、お使いのDBによってはエラーになるかも知れません。 手元のMySQL5.5でやってみたところ、一応、おもぞみの結果が得られましたので、参考程度にしてください。 1)の処理が分からないということですので、その該当部分です。 `id`にインデックスを付けてから試しました。 SELECT (SELECT IF(SUM(`point`)>=420, `id`, NULL) FROM `record` TMP WHERE `id`=REC.`id` ORDER BY `timestamp` DESC LIMIT 0, 5) as `id` FROM `record` REC GROUP BY `id`

shiren2
質問者

お礼

解答ありがとうございます。複雑ですね…。 SQLは初歩レベルなので勉強になります。 >DBの種類がわかりませんので すみません、書き忘れていました。 sqlite3を使っていますので、参考にして移植出来ないか試してみようと思います。

shiren2
質問者

補足

お陰様で出来ました! ありがとうございました! 最終的には個々のレコードを区別するuniq_keyを追加して、以下のようにしました。 SELECT id, SUM(point), COUNT(id) FROM record r1 WHERE r1.uniq_key IN (SELECT uniq_key FROM record r2 WHERE r1.id = r2.id ORDER BY `timestamp` DESC LIMIT 0,5) GROUP BY id HAVING 420 <= SUM(point);