SQLなら俺に訊け [無断転載禁止]©2ch.net (457レス)
SQLなら俺に訊け [無断転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1499985653/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
12: デフォルトの名無しさん [] 2017/11/03(金) 20:07:37.65 ID:N8t7Jq3a SQL初心者です。 複数のrowを一度に取りたいのですがどう書けばいいのでしょうか。 後述の(C)より効率のよい記述を探しています。 (なおRock54回避の為シングルクオートを全角に、またselectをカタカナに変更しています) 用途は掲示板で、以下のような「先頭と最近の5投稿」の取得が目的です。 https://mevius.5ch.net/tech/ 環境はSQLiteです。SQLite依存で構いません。 単純には以下2クエリになりますが、 select * from thread order by no limit 1; // (A) select * from thread order by no desc limit 5; // (B) A-B間で更新されたときに過渡状態のデータが返ることを避けるため、一つに纏めたいのです。 SQLiteでは読み込みにはトランザクションが使えず、BEGIN/COMMITで囲んでブロック出来ません。 試行錯誤して一応以下のクエリは通るようですが、サブクエリが効率が悪く見えるのでもっと良い書き方を探しています。 セレクト from ’1234’ where no in (values(’1234’) union セレクト no from ’1234’ order by rowid desc limit 6); // (C) ここで1234はスレッド名=スレッド最初の投稿Noです。 4chanのように板毎にNoが打たれており、スレ内のNoは飛び飛びになっています。 なお前側values部分もサブクエリにして先頭番号を取得する limit 1のサブクエリも書き方があれば教えてください。 (デバッグ時に使う) これも出来ません。例えば、以下は通りません。 セレクト * from ’1234’ where no in ((セレクト no from ’1234’ limit 1) union セレクト no from ’1234’ order by rowid desc limit 6); // (D) // limitはunionの後に、とエラーが出る (A)+(B)は同時にデータも取得する為、(C)より効率がいいと考えています。 (データの順序が異なるが、簡単にカバー出来る範囲なので問題ない) ただし(A)+(B)だと場合によっては中途半端なデータが返る時があり、これは避けたいのです。 なお初心者の為上記前提がいろいろ間違っているかもしれませんが、その辺はご指摘下さい。 http://mevius.5ch.net/test/read.cgi/tech/1499985653/12
18: デフォルトの名無しさん [sage] 2017/11/04(土) 01:32:35.14 ID:tY9TOSMT >>12を取り下げます。 どうやら私の書き方が悪かったようで、別々に打たないといけないらしく、 そうすればあっさり出来ました。 どうもすいません。 参考にしたページは以下です。 http://d.hatena.ne.jp/hide-K/20090623/1245752394 http://mevius.5ch.net/test/read.cgi/tech/1499985653/18
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.025s