MySQL删除“n”行之间的记录
我正在尝试选择第二行和第五行之间的记录。我的id不是按顺序排列的,因此我尝试通过以下方式检索行号: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 我得到的是行数列不存在,而
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)