アルファベット順のクエリがあります
select id, color_name from colors order by color_name
出力
| 4 | 青 | 1 | 赤 | 2 | バイオレット | 3 | 黄色
特定のレコードの前後のレコードを照会したい。例:赤
必要な出力:
| 4 | 青 | 1 | 赤 | 2 | バイオレット
ありがとう。
UNIONを使用してみてください:
SELECT A.id, A.color_name FROM (
(
SELECT id, color_name FROM colors
WHERE color_name <= 'red'
ORDER BY color_name DESC
LIMIT 2
)
UNION
(
SELECT id, color_name FROM colors
WHERE color_name > 'red'
ORDER BY color_name ASC
LIMIT 1
)
) as A
ORDER BY A.color_name
変数を使用して結果セットをランク付けし、同じ結果セットをそれ自体に結合できます。色名は赤で、ランク番号は「赤」のランクの1桁以内です。
SELECT b.id, b.color_name
FROM
(
SELECT a.*, @rn:=@rn+1 AS rn
FROM colors a
CROSS JOIN (SELECT @rn:=0) AS var_init
ORDER BY a.color_name
) a
INNER JOIN
(
SELECT a.*, @rn2:=@rn2+1 AS rn
FROM colors a
CROSS JOIN (SELECT @rn2:=0) AS var_init
ORDER BY a.color_name
) b ON a.color_name = 'red' AND a.rn IN (b.rn-1, b.rn, b.rn+1)
リストの最初または最後にある色を検索している場合は、もちろん、2つの結果のみが表示されます。
select id, color_name from (
select rowno, id, color_name from (
select @rownum:=@rownum+1 rowno, id, color_name from
colors, (select @rownum:=0) t1
order by color_name
) t2
where rowno in (@row:=(
select rowno from (
select @rownum:=@rownum+1 rowno, color_name
from colors, (
select @rownum:=0) t3
order by color_name
) t4
where color_name = "red"), @row + 1, @row -1 )) t5