• ベストアンサー

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

こんにちは。 SQLite3で次のようなクエリを書けるかどうかご存じの方、教えてください。 文房具の商品レコードを格納したテーブルがあります。 えんぴつ50円、ノート100円、ホチキス150円といった具合です。このテーブルから無作為にレコードを取り出し続けたいのですが、取り出した複数レコードの金額の合計が1000円を超えたところでストップしたいです。1050円でも1200円でもいいのですが、超えたところで止めたいのです。 インターフェイスとしてPHPを予定していて、そこででごにょごにょすればできるのですが、そもそもSQLの時点でこうしたことができるのかご存じの方教えてください。

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

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 がなくても、これで、行の特定が可能 -- 多重サブクエリは問題なく実行できます。実行速度的にどうなのかは、未検証。何千行もあるとかでなければ、そう待たされはしないと思うけど。

tuktukrace
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

あ、見直してたら、テーブルエイリアス名の抜けを発見。 sum(nedan) のところ、2カ所とも、b エイリアスを加えて下さい sum(b.nedan) 実行チェックまで行ってないのがばればれ。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • sql文のヵウント関数について

    sql文のcountを使い、humanテーブルのレコード件数を取得し出力したいのですが、 Object of class SQLite3Result could not be converted to string in のエラーが出て困っています。 (1)humanテーブルのレコード件数を表示する方法を教えてください。(sql文はうまく動いているのが確認できているので、表示する方法を教えていただきたいです。データベースの接続も正常です。) (2)sqlの出力って配列のみなのでしょうか? <?php // 変数の初期化 $db = null; $query=null; $con =null; $db = new SQLite3("test.db"); $res = $db->query ($sql); // データの取得 $query = "SELECT count (id) from human"; //クエリを実行 $con = $db->query($query); //データの件数を表示する print $con; ?>

    • ベストアンサー
    • PHP
  • SQLiteのデータベースについて

    PHP初心者です。以下のSQLiteより作成するデータベースについて教えてください。 $DB = sqlite_open('db1.db'); $sql="create table tables(id integer ,name,texts)"; $result=sqlite_query($db,$SQL); 上記、プログラムにより、同ディレクトリに、db1.dbが作成されますが、このデータベース情報はどのようにして、閲覧するのでしょうか(MS-ACCESS、SQLのように簡単に閲覧できないのか)。主キーやテーブルの名前またはフィールドの名前の変更、データ一覧閲覧などどのようにするのでしょうか。 環境は、Windows環境で、PHP4を使用しております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • SQLの性能

    クエリアナライザで実行すると30秒くらいかかるようなSQLがあるのですが、修正の余地について教えてください。 抽出元となるテーブルのレコード数が多くても、クエリの書き方やインデックスの張り方で速くなるのは知っていますが、限界はないのでしょうか? 単純に抽出元となるテーブルのレコード数が多いことが原因なのか、クエリやインデックスが原因なのかを判断する方法を教えてください。

  • SQLite:項目が存在しない場合のみINSERT

    SQLiteのテーブル内にunique属性を持つフィールドがあります。このフィールドと同名の内容を追加するとエラーが返りますが、SQLiteを呼び出すプログラム側で逐一そのエラーを例外処理しているため、プログラムとしては効率が悪いです。「(If not exist (...) insert ...のような)もしこの項目内容が存在しなければフィールドを追加する」という処理をSQLのクエリ文で完結させたいのですが、このようなことはできますでしょうか。

  • SQlite

    SQLiteを使って メールを保存するデータベースを作っています。 以下のようになっています。  さらに、 アドレス帳を作りたいのですが 新たにデータベースを開くのか 同じデータベースで別のテーブルを開けばよいのかわかりません。 ご存知の方よろしくお願いします。 また、 C++からSQLiteを扱う上での参考書などもありましたら 教えてください。 rc = sqlite3_open(".\\mailbox\\SQMail.db", &db); if( rc ){ AfxMessageBox("Can't open database:", MB_OK); sqlite3_close(db); return; } rc = sqlite3_exec(db, "create table MailTbl (id INTEGER PRIMARY KEY, attach varchar(20), subject varchar(120),addressfrom varchar(80),addressto varchar(80),date varchar(80),size integer,priority integer, read integer, state integer, alldata blob);", callback, 0, &zErrMsg); if( rc!=SQLITE_OK ){ // AfxMessageBox("SQL error:", MB_OK); sqlite3_free(zErrMsg); }

  • VBAとSQLITEでAddNewメソッド

    こんにちは! Access VBAとSQLITEを接続して、SQLITEにデータをインサートしたいと思っています。 ADOを利用して、ADDNEWメソッドでデータを入れたいのですが、うまく動きません。 書いているコードは下記になります。 'ローカル定数 'Xはネットワークドライブ Const DRIVER_NAME As String = "Driver=SQLite3 ODBC Driver;Database=X:\test.sqlite3;" 'コネクト Set CON = New ADODB.Connection Set RS = New ADODB.Recordset CON.ConnectionString = DRIVER_NAME CON.Open 'レコードセット sql = "select * from TABLE1" table = "TABLE1" '↓問題無く通りますが、TABLE1にはデータが1件も存在しません。 RS.Open sql, CON, adOpenDynamic, adLockOptimistic '↓ここで実行エラー 3021 BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。と表示されます。 RS!F1 = "abc" '↑TABLEにはデータが一件も無い為に、このようなメッセージが表示されると思います。 '↓ODBCドライバは要求されたプロパティをサポートしていません。と表示されます。 RS.Open table, CON, adOpenDynamic, adLockOptimistic 何故、上記のようなメッセージが表示されるのでしょうか?これを解決してAddNewメソッドでデータの挿入を行いたいと思っています。 宜しくお願いします!

  • SQLiteで、ランダムにレコードに番号を振るには

    お世話になります。 SQLite3で、テーブル中のレコードをランダムに 並び替えた後、その順番で1から番号を入れて いきたいのですが、それを少手順でできるSQL等は ありますでしょうか。 例えば、 1,りんご,0 2,いちご,0 3,いちじく,0 4,トマト,0 5,ほうれんそう,0 等とあった場合、一番最後の場所に、 3,いちじく,1 5,ほうれんそう,2 2,いちご,3 1,りんご,4 4,トマト,5 …と、1から順に番号を振りたいのです。 勿論、一つ一つ順を追っていけば、できない事ではありませんが、 頻繁に繰り返して行いたいのでできれば軽く、早くしたいのですが…。 良い方法がありましたらお教えください。 よろしくお願いいたします。

  • [ACCESS97]SQLの書き方

    グラフのレコードソースにクエリ・SQLを使用しています。データ入力チェックに使おうと思っています。妙なデータがはいった場合、グラフが乱れるのではないかと。 ソートは日付でしています。 それで、100レコードずつを順番に表示していきたいのですが、top値 だと最初からいくつ、、としか指定できません。これを、レコードの途中の任意の位置から取るにはどうしたらいいのでしょうか? IDとかのようにユニークな値でソートしているのであれば、大小関係で一発ですが、同じ値がいくつも存在する日付なもので困っています。 日付でソートしたものを配列に入れる、もしくは一度テーブルに書き出す等も考えているのですが、SQLでできたら助かります。 よろしくお願いします。

  • SQLiteのLike句で抽出できない

    SQLiteのLike句で抽出できないレコードがあります。 原因についてご教授いただけますでしょうか。 以下、操作手順になります。 ■データベースの作成 C:\>sqlite3.exe member.db SQLite version 3.7.15.2 2013-01-09 11:53:05 Enter ".help" for instructions Enter SQL statements terminated with a ";" ■テーブルの作成、レコードの追加 sqlite> create table t_member(name text, age integer); sqlite> insert into t_member values('山田一郎', 25); sqlite> insert into t_member values('田中次郎', 35); sqlite> insert into t_member values('鈴木三郎', 45); ■検索 sqlite> select * from t_member where name like '%一郎'; 山田一郎|25 sqlite> select * from t_member where name like '%次郎'; 田中次郎|35 sqlite> select * from t_member where name like '%三郎'; sqlite> 三郎だけが検索条件に適合しないのは何故でしょうか。 よろしくお願いします。

  • SQLiteで日付の取得

    SQLiteのクエリについてお教え頂けませんでしょうか? テーブル名:MyTable 列名:MyDate(TEXT型) MyDateのデータ 20150501102722_XYZ 20150502102722_AVC 20150505102722_BCD データはYYYYMMDDHHMMSS形式 + ランダムなアルファベットになっています。 クエリで201502以上のデータを取得したいと思っています。つまり、 20150502102722_AVC 20150505102722_BCD 上記の2つのデータが欲しいです。 そこで下記のようなSQLを書きました。 SELECT * FROM MyTable WHERE MyDate >= substr(1,8) しかしデータは1件も取得できませんでした。 そこで、試しに下記のようなクエリも書いてみましたが、これもダメでした。 SELECT * FROM MyTable WHERE MyDate = substr(1,8) どのようにすれば、データを取得する事ができるでしょうか?よろしくお願いいたします。

エラー表示 E6
このQ&Aのポイント
  • ブラザー製品のエラー表示E6についての相談です。
  • 下糸が出てこない、絡まる、針を替えたり絡まった糸くずなどを処理してもまたすぐ絡まりE6と表示されるトラブルに困っています。
  • ブラザー製品のPS205のエラー表示E6に関する質問です。
回答を見る