2017-03-08 5 views
0

フィールドIDとLogTimeを含むテーブル、ログから複数の単一値統計を取得することに興味があります。私はすべてのこのようUNIONと一緒にリンクされ、いくつかのSELECT *(ログからSELECT)文でこれを行うことができます。これはpCallBack_Dataとして定義された構造に返された値を置くCのSQLite:テーブルから複数の単一値の統計情報をより効率的に取得する

sql_stmt = sqlite3_mprintf(\ 
"SELECT * FROM (SELECT MIN(LogTime) FROM log) UNION ALL \ 
SELECT * FROM (SELECT MAX(LogTime) FROM log) UNION ALL \ 
SELECT * FROM (SELECT LogTime FROM log WHERE LogTime > %f ORDER BY logTime LIMIT 1) UNION ALL \ 
SELECT * FROM (SELECT COUNT(*) FROM log) UNION ALL \ 
SELECT * FROM (SELECT COUNT(*) FROM log WHERE LogTime > %f) UNION ALL \ 
SELECT * FROM (SELECT MIN(ID) FROM log) UNION ALL \ 
SELECT * FROM (SELECT MAX(ID) FROM log)", t1, t2); 

sqlite3_exec(db, sql_stmt, f_CallBack, pCallBack_Data, &errmsg) 

が、そこはやってのより効率的な方法でありますこの?多分要素をこのような単一のSELECTに結合するのでしょうか?

SELECT MIN(LogTime), MAX(LogTime), COUNT(*) from log 

私はそれがUNION内の他の文は、単一の値を返す一列に3つの値を返すのでそれが動作しません知っています。

+0

あなたは行ごとに単一の値を意味しますか? – Simon

+0

すべての値を1行に戻すと何が問題になりますか? – JeremyP

+0

はい、今は行ごとに1つの値を返しますが、1行にすべてを戻すことには何も問題ありません。私はコールバックでその行を解析する必要があります。私はどのように "WHERE LogTime>%f"の場合にすべての行を1行に入れるのかはわかりません。 –

答えて

0

私は、JeremyPが単一行オプションを提案した後にそれを理解したと思います。 1つのSELECT *とそれに続くカンマ区切りのSELECTを使用すると、すべてが1行で出力されます。誰かがより効率的な方法を提案できない限り、私はこれと一緒に行くと思います:

+0

うーん...興味深い。私はちょうど私がこれらの文を1000回呼んだところでテストをしました。 UNION ALLを含む上位のステートメントは4.2秒で実行され、より簡潔なステートメントは9.6秒かかりました。これが私が物事をより効率的に行う方法を探している理由です。ボトムステートメントはより簡潔ですが、実行に2倍以上の時間がかかります。 –

関連する問題