首先对行进行排序,然后在 MySQL 中添加临时自增列
First sort rows then add temporary auto-increment column in MySQL
我喜欢做什么:
- 首先:根据规则对列进行排序。
- 第二:添加一个自增列,这样每一行都会有正确的顺序编号.
目前的问题:
我下面的代码只能先创建auto-increment
列,然后才会开始排序。这会导致自增列中的编号不连续。
代码:
SET @i:=0;
SELECT
@i:=@i+1 AS autoincr_id,
billings.id AS bill_id,
daily_reports.id AS report_id,
billings.billingDate AS billing_date
FROM lineitems
INNER JOIN billings
ON billings.order_id=lineitems.orderID
INNER JOIN daily_reports
ON billings.`billingDate` BETWEEN DATE_ADD(daily_reports.`referenceDate`, INTERVAL 7 HOUR ) AND DATE_ADD(daily_reports.`referenceDate`, INTERVAL 31 HOUR )
ORDER BY billings.id, autoincr_id
LIMIT 200
查看说明我的问题的图片
猜测使用交付的 table 强制排序然后使用变量将解决您的问题。
您也可以使用 CROSS JOIN 来初始化用户变量 @i
而无需使用两个查询。
查询
SELECT
@i := @i + 1 AS autoincr_id,
bill_id,
report_id,
billing_date
FROM (
SELECT
billings.id AS bill_id,
daily_reports.id AS report_id,
billings.billingDate AS billing_date
FROM lineitems
INNER JOIN billings
ON billings.order_id=lineitems.orderID
INNER JOIN daily_reports
ON billings.`billingDate` BETWEEN DATE_ADD(daily_reports.`referenceDate`, INTERVAL 7 HOUR ) AND DATE_ADD(daily_reports.`referenceDate`, INTERVAL 31 HOUR )
ORDER BY billings.id
LIMIT 200
)
AS ordered
CROSS JOIN ( SELECT @i := 0 ) AS init_user_param
创建一个 new
table,其中的行按所需的顺序编号 seq_num
:
CREATE TABLE new (
seq_num INT UNSIGNED AUTO_INCREMENT,
PRIMARY KEY seq_num
) ENGINE=InnoDB
SELECT ...
ORDER BY ...
警告:如果您处于 multi-Master 复制设置中,AUTO_INCREMENT
将不会有连续的 ID。这是因为 auto_increment_increment
不会是 1
.
我喜欢做什么:
- 首先:根据规则对列进行排序。
- 第二:添加一个自增列,这样每一行都会有正确的顺序编号.
目前的问题:
我下面的代码只能先创建auto-increment
列,然后才会开始排序。这会导致自增列中的编号不连续。
代码:
SET @i:=0;
SELECT
@i:=@i+1 AS autoincr_id,
billings.id AS bill_id,
daily_reports.id AS report_id,
billings.billingDate AS billing_date
FROM lineitems
INNER JOIN billings
ON billings.order_id=lineitems.orderID
INNER JOIN daily_reports
ON billings.`billingDate` BETWEEN DATE_ADD(daily_reports.`referenceDate`, INTERVAL 7 HOUR ) AND DATE_ADD(daily_reports.`referenceDate`, INTERVAL 31 HOUR )
ORDER BY billings.id, autoincr_id
LIMIT 200
查看说明我的问题的图片
猜测使用交付的 table 强制排序然后使用变量将解决您的问题。
您也可以使用 CROSS JOIN 来初始化用户变量 @i
而无需使用两个查询。
查询
SELECT
@i := @i + 1 AS autoincr_id,
bill_id,
report_id,
billing_date
FROM (
SELECT
billings.id AS bill_id,
daily_reports.id AS report_id,
billings.billingDate AS billing_date
FROM lineitems
INNER JOIN billings
ON billings.order_id=lineitems.orderID
INNER JOIN daily_reports
ON billings.`billingDate` BETWEEN DATE_ADD(daily_reports.`referenceDate`, INTERVAL 7 HOUR ) AND DATE_ADD(daily_reports.`referenceDate`, INTERVAL 31 HOUR )
ORDER BY billings.id
LIMIT 200
)
AS ordered
CROSS JOIN ( SELECT @i := 0 ) AS init_user_param
创建一个 new
table,其中的行按所需的顺序编号 seq_num
:
CREATE TABLE new (
seq_num INT UNSIGNED AUTO_INCREMENT,
PRIMARY KEY seq_num
) ENGINE=InnoDB
SELECT ...
ORDER BY ...
警告:如果您处于 multi-Master 复制设置中,AUTO_INCREMENT
将不会有连续的 ID。这是因为 auto_increment_increment
不会是 1
.