0

私のウェブサイトに画像ギャラリーがあり、データベースの最後に到達すると最初の画像に送り返される次/前のボタンを実装したいと考えています。

次のボタンで機能する MYSQL クエリがあります。問題は前のものからです。次のボタンと同じコードを使用します (機能するように値を変更しました) が、データベースの最初の項目でスタックしたままです。

id自動インクリメント フィールドであるフィールドを使用してリストを並べ替えています。

これは次の私のコードです:

SELECT * 
FROM photos
WHERE   
         id = (SELECT MAX(id) FROM photos WHERE status = '0' AND id < ".$id.") 
      OR id = (SELECT MAX(id) FROM photos WHERE status = '0' )
LIMIT 1

これは、動作しない以前の私のコードです:

SELECT * 
FROM photos
WHERE   
         id = (SELECT MIN(id) FROM photos WHERE status = '0'  AND id > ".$id.") 
      OR id = (SELECT MIN(id) FROM photos WHERE status = '0' ) 
LIMIT 1

$id 変数は現在の画像 ID です。

SOに関する次/前の質問がたくさんあることは知っていますが、役立つものは見つかりませんでした。

4

1 に答える 1

0

あなたの問題は、結果セット内の現在の位置に関係なく、両方のクエリに最初/最後の写真が含まれる句の2番目のORオペランドに起因します。WHERE句が指定されていない場合、MySQL はそれらの結果が返される順序を保証しないためORDER BY、最初の項目はおそらく目的の前の項目の前に順序付けられているため、LIMIT句によってその項目のみが返されます。

この問題はORDER BY id DESCと をORDER BY id ASCそれぞれ指定することで解決できますが、そのようなテストは結果が返されるかどうかに基づいてアプリケーション内で実行する必要があるため、これらのオペランドを完全に削除することをお勧めします。

その後、次のクエリを簡素化できます。

SELECT   *
FROM     photos
WHERE    status = 0 AND id < $id
ORDER BY id DESC
LIMIT    1

そして前の場合:

SELECT   *
FROM     photos
WHERE    status = 0 AND id > $id
ORDER BY id ASC
LIMIT    1

id(これは、「次へ」でより低い の写真を取得し、「前へ」でより高い写真を取得することを実際に意図していたと仮定しますid。それ以外の場合は、2 つのクエリを入れ替えます)。

于 2012-05-26T08:16:48.410 に答える