如何更新utf8mb4_hungarian_ci
列,使其计数为1,2,3,4,...,然后在另一列number
更改时又从1重新开始?
这是到目前为止我得到的:
booking_id
我认为类似这样的方法应该可行,但是我不知道如何SET @pos := 0;
SET @last := 0;
UPDATE booking_segments
SET number = (SELECT @pos := if(booking_id = @last, @pos + 1, 1)), @last := booking_id
where 1
ORDER BY booking_id, pickup_time_utc;
在那里烦扰而不会产生语法错误。如果使用MySQL和像JS这样的逗号运算符,我可以做到,但是我不确定@last := booking_id
块中还有哪些有效的方法。
我发现了一些东西,但是有没有一种贫民窟的方式呢?
SET
Here's the result,如果您在构图时遇到困难。
SET @pos := 0;
SET @last := 0;
UPDATE booking_segments
SET number = @tmp := (SELECT @pos := if(booking_id = @last, @pos + 1, 1)),
number = @last := booking_id,
number = @tmp
where 1
ORDER BY booking_id,pickup_time_utc ;
我当前使用的版本是10.1.14-MariaDB。
答案 0 :(得分:1)
MariaDB started supporting Window/Analytic functions since version 10.2;因此,如果可以升级,则可以利用Row_Number()
功能。
在派生表中,我们首先可以在booking_id
以升序排列的pickup_time_utc
分区上获取每一行的“行号”。然后,我们可以联接回到主表,以更新number
列。该查询将仅是以下内容:
UPDATE booking_segments AS bs
JOIN (SELECT id,
Row_number()
OVER (
partition BY booking_id
ORDER BY pickup_time_utc ASC) AS rn
FROM booking_segments) AS dt
ON dt.id = bs.id
SET bs.number = dt.rn