首先对行进行排序,然后在 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.