Join mySQL上的Order by和索引

Join mySQL上的Order by和索引,mysql,sql,Mysql,Sql,我有一个名为MI_APR的表。我使用左联接从日历表中引入数据。正在传输的数据是一列日期,列名称为First\U Date ALTER TABLE MI_APR ADD COLUMN `Profile` CHAR(8) NOT NULL DEFAULT 'MI', ADD COLUMN First_Date DATE, CHANGE `Location Label` `Label`TINYTEXT; UPDATE MI_APR LEFT JOIN calendar

我有一个名为MI_APR的表。我使用左联接从日历表中引入数据。正在传输的数据是一列日期,列名称为First\U Date

ALTER TABLE MI_APR
    ADD COLUMN `Profile` CHAR(8) NOT NULL DEFAULT 'MI',
    ADD COLUMN First_Date DATE,
    CHANGE `Location Label` `Label`TINYTEXT;

    UPDATE MI_APR LEFT JOIN calendar on MI_APR.`Period` = calendar.`Unique_Period`
    SET
    MI_APR.`First_Date` = calendar.`First_Date`
连接完成后,我需要一些帮助来排序ASC中的第一个_DATE列,这是一个格式为YYYY-MM-DD的简单日期列。 然后,我需要添加一个名为INDEX的新列,该列的值从0开始表示最早的月份,并根据MI_APR表中DATES列中的月数向上计数。该指数将持续上涨,即使是跨年度。见下例:

EXPECTED OUTPUT
    FIRST_DATE    INDEX
    2018/10/01    0
    2018/11/01    1
    2018/12/01    2
    2019/01/01    3

谢谢

您可以使用此查询动态计算索引:

SELECT First_Date, TIMESTAMPDIFF(MONTH, earliest_date, First_Date) AS Index
FROM MI_APR
, (SELECT First_Date AS earliest_date FROM MI_APR ORDER BY First_Date ASC LIMIT 1) fancy_alias;
如果结果令您满意,您可以将其转换为更新。不过,我的建议是,您不应该存储数据,因为数据很容易在运行中计算出来

UPDATE MI_APR
, (SELECT First_Date AS earliest_date FROM MI_APR ORDER BY First_Date ASC LIMIT 1) fancy_alias
SET `Index` = TIMESTAMPDIFF(MONTH, earliest_date, First_Date);
关于你的评论,我也希望该表被排序,然后更新。
一张桌子上没有你可以信赖的秩序。如果希望从select排序中得到结果,请使用ORDER BY子句。

您可以使用此查询动态计算索引:

SELECT First_Date, TIMESTAMPDIFF(MONTH, earliest_date, First_Date) AS Index
FROM MI_APR
, (SELECT First_Date AS earliest_date FROM MI_APR ORDER BY First_Date ASC LIMIT 1) fancy_alias;
如果结果令您满意,您可以将其转换为更新。不过,我的建议是,您不应该存储数据,因为数据很容易在运行中计算出来

UPDATE MI_APR
, (SELECT First_Date AS earliest_date FROM MI_APR ORDER BY First_Date ASC LIMIT 1) fancy_alias
SET `Index` = TIMESTAMPDIFF(MONTH, earliest_date, First_Date);
关于你的评论,我也希望该表被排序,然后更新。
一张桌子上没有你可以信赖的秩序。如果要从select排序得到结果,请使用ORDER BY子句。

如果要排序,则它是select而不是更新,对吗?@DanielE是的,我假设应该在某个地方使用select,但不确定在这种情况下如何添加它。我需要列的排序仅在联接之后进行,因为DATES列仅在联接发生之后才出现。@DanielE我还希望对表进行排序,然后更新以反映新的排序顺序如果排序是选择而不是更新,是吗?@DanielE是的,我假设应该在某个地方使用select,但不确定在这种情况下如何添加它。我需要列的排序仅在联接之后发生,因为DATES列仅在联接发生之后出现。@DanielE我还希望对表进行排序,然后更新以反映新的排序顺序最早的日期我需要在此处手动键入日期值吗?我想让公式从DATES列中动态选择最早的日期否,这是该列的别名,如图所示:,选择First_date作为Earlish_date。。。。它从您的表中读取最早的日期。好的,我尝试了,但是我得到了update语句的一个错误,还选择了语句相同的错误ER_PARSE_错误:您的SQL语法中有一个错误;请查看与MySQL服务器版本对应的手册,以了解在第3行“Index=TIMESTAMPDIFFMONTH,earlish_date,First_date”附近使用的正确语法索引是一个关键字,请使用更好的列名或将其放在反勾中。相应地编辑了我的答案。我需要在此处手动键入日期值的最早日期吗?我想让公式从DATES列中动态选择最早的日期否,这是该列的别名,如图所示:,选择First_date作为Earlish_date。。。。它从您的表中读取最早的日期。好的,我尝试了,但是我得到了update语句的一个错误,还选择了语句相同的错误ER_PARSE_错误:您的SQL语法中有一个错误;请查看与MySQL服务器版本对应的手册,以了解在第3行“Index=TIMESTAMPDIFFMONTH,earlish_date,First_date”附近使用的正确语法索引是一个关键字,请使用更好的列名或将其放在反勾中。据此编辑了我的答案。