MySQL删除“n”行之间的记录

MySQL删除“n”行之间的记录,mysql,Mysql,我正在尝试选择第二行和第五行之间的记录。我的id不是按顺序排列的,因此我尝试通过以下方式检索行号: SELECT @curRow := @curRow + 1 AS row_number FROM product_image p JOIN (SELECT @curRow := 0) r WHERE row_number BETWEEN 2 AND 5 我的桌子有点像: id name 23 A 42 B 98 C 102 D 109 E 我得到的是行数列不存在,而

我正在尝试选择第二行和第五行之间的记录。我的id不是按顺序排列的,因此我尝试通过以下方式检索行号:

SELECT  @curRow := @curRow + 1 AS row_number
FROM    product_image p
JOIN    (SELECT @curRow := 0) r
WHERE   row_number BETWEEN 2 AND 5
我的桌子有点像:

id  name 
23  A
42  B
98  C
102 D
109 E
我得到的是行数列不存在,而且它确实不存在。但是,如何检索第2到第5个、第3到第4个之间的记录呢?我发了类似的帖子,但不太理解这个问题。提前谢谢你

您可以使用JOIN执行删除操作:

派生选项卡t是使用您的查询创建的。您可以加入此表,以便识别所需的任何记录并将其删除

检查这个-


查询失败的原因是不能在WHERE子句中使用列别名。但是,您可以通过以下方式在组中使用它们:


要向查询中添加合成行号,需要一个子查询。像这样

SELECT id FROM (
          SELECT    p.*, @curRow := @curRow + 1 AS row_number
            FROM    product_image p
            JOIN    (SELECT @curRow := 0) r
         ) q
 WHERE   row_number BETWEEN 2 AND 5
然后,如果愿意,可以使用结果驱动删除操作

   DELETE FROM product_image
    WHERE id IN (
    SELECT id FROM (
              SELECT    p.*, @curRow := @curRow + 1 AS row_number
                FROM    product_image p
                JOIN    (SELECT @curRow := 0) r
             ) q
     WHERE   row_number BETWEEN 2 AND 5
    )

但这是一件非常糟糕的事情。为什么?您依赖于内部查询结果集中的特定顺序。SQL结果集中的行没有任何ORDERBY子句,而是以不可预测的顺序返回。服务器优化器利用此漏洞。不可预测就像是随机的,但更糟。Random意味着每次运行查询时顺序不太可能相同。这里的随机性很好,因为您将在测试期间发现您的问题。另一方面,不可预测性意味着顺序在不可预测之前保持不变。如果您不确定这是为什么,请查阅墨菲定律。

因为您实际上不需要选择行号,所以不需要依赖未记录的功能,如@curRow:=@curRow+1。只需使用限制和偏移。要选择从2到5的行,您只需要

select id
from product_image
order by name, id
limit 4
offset 1
注意,您需要一个定义良好的ORDERBY子句。否则,结果可能取决于发动机使用的索引

要删除这些行,请使用delete。。联接语句

delete product_image
from product_image
join (
  select id
  from product_image
  order by name, id
  limit 4
  offset 1
)x using(id)
演示:


不要耍花招。没有复杂的查询。

mysql数据库中的行顺序不能保证。所以做你想做的事情是很有风险的,是的,我也知道:但我最感兴趣的是如何建立这种查询:你可以利用TOP来解决这个问题。它类似于从id不在顶部的表中选择前2条记录2@RishikeshDhokareMySQL不支持TOPWhat,如果只检索6条记录并按排序(比如按列排序)。类似于选择。。。其中prod_id=36。。。按ASC排序,然后得到第三个和第四个。这是否可以接受?是的,如果使用确定的排序顺序,则不会出现不可预测性问题。
   DELETE FROM product_image
    WHERE id IN (
    SELECT id FROM (
              SELECT    p.*, @curRow := @curRow + 1 AS row_number
                FROM    product_image p
                JOIN    (SELECT @curRow := 0) r
             ) q
     WHERE   row_number BETWEEN 2 AND 5
    )
select id
from product_image
order by name, id
limit 4
offset 1
delete product_image
from product_image
join (
  select id
  from product_image
  order by name, id
  limit 4
  offset 1
)x using(id)