2

現在、PHPとSQLiteを使用して左右に2つの画像を表示するページがあります。

特定の画像IDを使用してクエリを実行します

  • その画像のファイル
  • 次の画像のファイル
  • 次の次の画像へのリンク
  • 前の前の画像へのリンク
  • 前の画像へのリンク (前の画像が存在しない場合)

オフセットを使用してみましたが、オフセットが範囲外の場合、クエリ全体が失敗するようです。それを防止またはキャッチする方法はありますか?

select id, file, findex
  from vfb
 where findex > (select findex from vfb where findex<4 and bookcode='BEFB'
                 order by findex desc limit 1 offset 1)
   and findex < (select findex from vfb where findex>4 and bookcode='BEFB'
                 order by findex asc limit 1 offset 1)
   and bookcode='BEFB'
 order by findex asc;

今、私はselect(select a where x<1) as a1, (select a where x=1) as b1, (select b where x=1) as c1構造を使用していますが、これは非常に醜く、( ) のようなクエリからさらに情報が必要であることがわかりましたselect a where x<1

では、クエリを短縮したり、次のようなものを使用したりする方法はあります(select a,b where x<1) as a1,b2か?

私のテーブルはId|bookcode|page|findex(fakepage)|file|title|stuff|morestuff

完全な醜い選択:

select 
(select findex from vfb where bookcode='BOOK' and findex<
    (select findex from vfb where bookcode='BOOK' and findex<100 order by findex desc limit 1) order by findex desc limit 1) as p2,
(select findex from vfb where bookcode='BOOK' and findex<100 order by findex desc limit 1) as p1,
(select file from vfb where bookcode='BOOK' and findex==100) as f1,
(select file from vfb where bookcode='BOOK' and findex>100 order by findex asc limit 1) as f2,
(select findex from vfb where bookcode='BOOK' and findex>
    (select findex from vfb where bookcode='BOOK' and findex>100 order by findex asc limit 1) order by findex asc limit 1) as n2;

結果:
98|99|BOOK_Page_104_Image_0001.png|BOOK_Page_105_Image_0001.png|102

オフセットを使用してみましたが、オフセットが範囲外の場合、クエリ全体が失敗するようです。それを防止またはキャッチする方法はありますか?

4

2 に答える 2

1

いいなぞなぞ、私は findex フィールドだけを考えました。
してみてください:

  SELECT t3.findex , t2.findex, t4.findex
    FROM vfb t1
    JOIN vfb t2 ON t1.findex > t2.findex
    JOIN vfb t3 ON t2.findex > t3.findex
    JOIN vfb t4 ON t1.findex < t4.findex
    WHERE
    t1.findex = 100
    AND t1.bookcode='BOOK' 
    AND t2.bookcode='BOOK' 
    AND t3.bookcode='BOOK'
    AND t4.bookcode='BOOK'
    ORDER by t3.findex desc, t2.findex desc, t4.findex asc
    LIMIT 1

上記が機能している場合は、findex 列にインデックスを追加することを検討してください。GL!

于 2013-03-15T07:46:45.490 に答える
0

それが私が取り組んでいたものだったので、PHPの重い実装を行うことになりました。最終的に次のような2つのクエリがありました。

$result = $db->query('select * from vfb where findex<=
(select findex from vfb where id=222)
and bookcode=(select bookcode from vfb where id=222)
group by page order by findex desc limit 3');

これは、現在のアイテムとその下の次の 2 つを取得します。上記の項目についても同じことができます。次に、PHP を使用して目的の値を取得しました。

于 2013-03-15T17:38:33.297 に答える