如何创建只在一条特定记录的前后显示的mysql查询?

如何创建只在一条特定记录的前后显示的mysql查询?,mysql,sql,Mysql,Sql,我有一个按字母顺序排列的查询 select id, color_name from colors order by color_name 输出 | 4 | blue | 1 | red | 2 | violet | 3 | yellow 我想查询特定记录的前后记录。示例:红色 期望输出: | 4 | blue | 1 | red | 2 | violet 谢谢。尝试使用工会: SELECT A.id, A.color_name FROM ( ( SELECT id, c

我有一个按字母顺序排列的查询

select id, color_name from colors order by color_name
输出

| 4 | blue | 1 | red | 2 | violet | 3 | yellow 我想查询特定记录的前后记录。示例:红色

期望输出:

| 4 | blue | 1 | red | 2 | violet 谢谢。

尝试使用工会:

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)
如果您碰巧正在搜索列表开头或结尾的颜色,那么当然,只会显示两个结果


查看演示可能不是最好的方法,但您可以将表选择到按颜色名称排序的临时表/表变量中,并添加标识列。然后,您可以从颜色=红色的临时表或红色的标识+/-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