好吧,假设我有一张桌子,上面有照片。
我要做的是在页面上根据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
只能ORDER BY为UNION‘d查询定义一个子句。使用UNION或都没关系UNION ALL。MySQL确实支持’d查询的LIMIT某些部分的子句UNION,但是如果没有定义顺序的能力,它就相对没有用。
ORDER BY
UNION
UNION ALL
LIMIT
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。这是完整的查询:
@midpoint - ROUND(@midpoint/2)
4
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