みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

SQLite3でこんな便利なSQLはできますか?

こんにちは。
SQLite3で次のようなクエリを書けるかどうかご存じの方、教えてください。

文房具の商品レコードを格納したテーブルがあります。

えんぴつ50円、ノート100円、ホチキス150円といった具合です。このテーブルから無作為にレコードを取り出し続けたいのですが、取り出した複数レコードの金額の合計が1000円を超えたところでストップしたいです。1050円でも1200円でもいいのですが、超えたところで止めたいのです。

インターフェイスとしてPHPを予定していて、そこででごにょごにょすればできるのですが、そもそもSQLの時点でこうしたことができるのかご存じの方教えてください。

投稿日時 - 2014-02-07 22:30:38

QNo.8465747

すぐに回答ほしいです

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

SQLiteには累積計算はないので、2つの同じ table を結合して、group 化という手順が必要だが、randam 順が同じ2つのテーブルを用意するには、temporary table を作る必要が有ると思う。
元のテーブルに primary keyカラム id が有るとして、以下の定義だとすると

create table bungu (
id integer primary key not null
,name char
,nedan int
);

create temporary table t_bungu
as select id ,nedan from bungu b order by random ;
-- 毎回作り直しすれば、毎回違う順になるので、temporary とする。

select id, name, nedan from bungu as a
where id in ( select id from t_bungu c join
( select a._rowid_ , sum(nedan) as x
from t_bungu a join t_bungu b on a._rowid_ >= b._rowid_
group by a._rowid_
having sum(nedan) > 1000
limit 1
) d on d._rowid_ >= c._rowid_
);
-- _rowid_ は、t_bunguテーブルに挿入された順。SQLite は、primary key がなくても、これで、行の特定が可能
-- 多重サブクエリは問題なく実行できます。実行速度的にどうなのかは、未検証。何千行もあるとかでなければ、そう待たされはしないと思うけど。

投稿日時 - 2014-02-09 18:11:47

お礼

ありがとうございます!!!
すごいですね。技術的な面もそうですが、発想にも驚きました。

SQLiteの実力にも驚きます!

投稿日時 - 2014-02-11 21:58:22

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

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

回答(2)

ANo.2

あ、見直してたら、テーブルエイリアス名の抜けを発見。
sum(nedan) のところ、2カ所とも、b エイリアスを加えて下さい
sum(b.nedan)

実行チェックまで行ってないのがばればれ。

投稿日時 - 2014-02-12 17:18:39

あなたにオススメの質問