我正在尝试选择让我们说第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)之间的记录?我红了类似的帖子,但没有很好地理解查询。提前谢谢!
答案 0 :(得分:3)
查询失败的原因是您无法在WHERE
子句中使用列别名。但是,您可以在GROUP BY
和HAVING
:
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)
。您可以加入此表以识别所需的任何记录并将其删除。
答案 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
。只需使用LIMIT
和OFFSET
即可。要选择从2
到5
的行,您只需要
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
没有技巧。没有复杂的疑问。