一尘不染

选择一行及其周围的行

sql

好吧,假设我有一张桌子,上面有照片。

我要做的是在页面上根据URI中的ID显示照片。下面的照片我想在附近的照片中显示10张缩略图,而当前照片应该在缩略图的中间。

到目前为止,这是我的查询(这只是一个示例,我使用7作为id):

SELECT
    A.*
FROM
  (SELECT
       *
   FROM media
   WHERE id < 7
   ORDER BY id DESC
   LIMIT 0, 4
   UNION
   SELECT
       *
   FROM media
   WHERE id >= 7
   ORDER BY id ASC
   LIMIT 0, 6
  ) as A
ORDER BY A.id

但是我得到这个错误:

#1221 - Incorrect usage of UNION and ORDER BY

阅读 160

收藏
2021-03-10

共1个答案

一尘不染

只能ORDER BYUNION‘d查询定义一个子句。使用UNION或都没关系UNION ALL。MySQL确实支持’d查询的LIMIT某些部分的子句UNION,但是如果没有定义顺序的能力,它就相对没有用。

MySQL还缺少排名功能,您需要使用排名功能来处理数据中的空白(由于条目被删除而丢失)。唯一的选择是在SELECT语句中使用一个递增变量:

SELECT t.id, 
       @rownum := @rownum+1 as rownum 
  FROM MEDIA t, (SELECT @rownum := 0) r

现在我们可以获得行的连续编号列表,因此我们可以使用:

WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2) 
                 AND @midpoint - ROUND(@midpoint/2) +@upperlimit

将7用作@midpoint的值,则@midpoint - ROUND(@midpoint/2)返回的值4。要总共获得10行,请将@upperlimit值设置为10。这是完整的查询:

SELECT x.* 
  FROM (SELECT t.id, 
               @rownum := @rownum+1 as rownum 
          FROM MEDIA t, 
               (SELECT @rownum := 0) r) x
 WHERE x.rownum BETWEEN @midpoint - ROUND(@midpoint/2) AND @midpoint - ROUND(@midpoint/2) + @upperlimit

但是,如果您仍然想使用LIMIT,则可以使用:

  SELECT x.* 
    FROM (SELECT t.id, 
                 @rownum := @rownum+1 as rownum 
            FROM MEDIA t, 
                 (SELECT @rownum := 0) r) x
   WHERE x.rownum >= @midpoint - ROUND(@midpoint/2)
ORDER BY x.id ASC
   LIMIT 10
2021-03-10