私はダンと同じ問題があったので、彼の答えを使用してそれを改善しました。
まず行インデックスを選択します。ここでは何も変わりません。
SELECT row
FROM
(SELECT @rownum:=@rownum+1 row, a.*
FROM articles a, (SELECT @rownum:=0) r
ORDER BY date, id) as article_with_rows
WHERE id = 50;
ここで、2つの個別のクエリを使用します。たとえば、行インデックスが21の場合、次のレコードを選択するクエリは次のようになります。
SELECT *
FROM articles
ORDER BY date, id
LIMIT 21, 1
前のレコードを選択するには、次のクエリを使用します。
SELECT *
FROM articles
ORDER BY date, id
LIMIT 19, 1
最初の行(行インデックスは1)の場合、制限は-1になり、MySQLエラーが発生することに注意してください。これを防ぐためにifステートメントを使用できます。とにかく以前のレコードがないため、何も選択しないでください。最後のレコードの場合、次の行があり、結果はありません。
また、ASCの代わりにDESCを使用して順序付けする場合、次の行と前の行を選択するクエリは同じですが、切り替えられます。