2

アルファベット順のクエリがあります

select id, color_name from colors order by color_name

出力

| 4 | 青
| 1 | 赤
| 2 | バイオレット
| 3 | 黄色

特定のレコードの前後のレコードを照会したい。例:赤

必要な出力:

| 4 | 青
| 1 | 赤
| 2 | バイオレット

ありがとう。

4

3 に答える 3

5

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
于 2012-07-26T04:11:05.260 に答える
3

変数を使用して結果セットをランク付けし、同じ結果セットをそれ自体に結合できます。色名は赤で、ランク番号は「赤」のランクの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つの結果のみが表示されます。


SQLFiddleでデモをチェックしてください

于 2012-07-26T04:47:00.927 に答える
1
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
于 2012-07-26T05:36:05.670 に答える