MySQL删除' n'之间的记录行

时间:2018-05-14 12:31:25

标签: mysql

我正在尝试选择让我们说第2和第5行之间的记录。我的ID不按顺序排列,因此我尝试以这种方式检索row_number

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

我得到的是row_number column doesn't exist,它确实不存在。但是如何检索2到5(第3和第4)之间的记录?我红了类似的帖子,但没有很好地理解查询。提前谢谢!

5 个答案:

答案 0 :(得分:3)

查询失败的原因是您无法在WHERE子句中使用列别名。但是,您可以在GROUP BYHAVING

中使用它们
SELECT  *, @curRow := @curRow + 1 AS row_number
FROM    product_image p
JOIN    (SELECT @curRow := 0) r
GROUP BY row_number
HAVING row_number between 2 and 5

答案 1 :(得分:1)

您可以使用https://maps.googleapis.com/maps/api/geocode/json?latlng=59.44350379999999%2C24.7476205&result_type=locality&key=YOUR_API_KEY执行DELETE

JOIN

使用您的查询创建派生的tabe DELETE p FROM product_image p INNER JOIN ( SELECT id, @curRow := @curRow + 1 AS row_number FROM product_image p CROSS JOIN (SELECT @curRow := 0) r ORDER BY id ) AS t ON p.id = t.id WHERE t.row_number IN (2,3) 。您可以加入此表以识别所需的任何记录并将其删除。

Demo here

答案 2 :(得分:1)

检查一下 - http://sqlfiddle.com/#!9/c462d/5

select * from 
    (
    SELECT  @curRow := @curRow + 1 AS row_number,p.*
    FROM    product_image p
    JOIN    (SELECT @curRow := 0) r)
    a 
    WHERE   a. row_number BETWEEN 2 AND 5

答案 3 :(得分:1)

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

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结果集中的行没有任何ORDER BY子句,以不可预测的顺序返回。服务器优化器利用它。不可预测就像是随机的,但更糟。随机意味着每次运行查询时订单不太可能相同。随机这里很好,因为你会在测试过程中发现你的问题。另一方面,不可预测的意思是订单保持不变直到它没有。如果你不确定为什么那么糟糕,请查阅Murphy'法律。

答案 4 :(得分:1)

由于您实际上不需要选择行号,因此无需依赖未记录的“功能”,如@curRow := @curRow + 1。只需使用LIMITOFFSET即可。要选择从25的行,您只需要

select id
from product_image
order by name, id
limit 4
offset 1

请注意,您需要一个定义良好的ORDER BY子句。否则结果可能取决于引擎使用的索引。

要删除这些行,请使用DELETE .. JOIN语句

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

演示:http://sqlfiddle.com/#!9/66fa4/1

没有技巧。没有复杂的疑问。