質問: 初歩的な質問で恐縮なのですが、SQLの書き方です。 pythonとsqliteを使っています。 所定の条件で検索した際に、そのレコードと共に、ヒット件数を表示させたいと思っています。 ``` select count(*) from table where age>20; ``` などとすればもちろん件数は分かるのですが、ただcountを使うと、同時にレコードをselectすることはできないように思います。 現状では ``` select count(*) from table where age>20; select * from table where age>20; ``` という具合に、2回SQLを実行しています。 これがどう見ても不細工ですし、効率も悪いように思うので、 なんとか1回のSQLで処理をしたいです。 どのようにすればよいのでしょうか。 ご指導お願いします。
回答: 一度に取得するとしたら以下の様にすれば取得はできますが、これはこれで不細工な感じですね。 ``` select *,(select count(*) from table t where age>20) from table where age>20 ``` ※他にもfrom 句でインラインビューの直積などでもできますけど、不細工さは同じ 全ての行に件数が埋め込まれますので、先頭を取得した際にでも取得すればいいのですけど。 上記で行うのなら、fetchall()の結果をlen()で求める方がすっきりします。 表示する際にページ制御を行う場合は、count()を別に取得する事が多いです。 selectで全件取得はせずに、ページに表示する件数をoffset とlimitで制御して行うことになりますが、 この際のoffsetは全体の件数(=count())とページ表示件数(=limitの値)から求めます。 ※取得するデータの数と開始位置を指定 項目の取得と件数の取得を一度に行ってしまうと、必ず全体の取得になるので、遅くなることがあります。 ※元々ページ制御を行うのは取得件数を限定して高速にしようというのが殆ど。 これはfetchall()でも同じなので、状況に応じて使い分けて下さい。 こんなのもありました。※まあ、そのような設計になっていればですけど。 OFFSETを使わない高速なページネーションの実現