【问题标题】:MYSQL: change current id value become sequence id each dayMYSQL:每天将当前id值更改为序列id
【发布时间】:2015-01-13 07:19:33
【问题描述】:

我想从下面的记录中显示 id 值:

id      name            date
24811   Foo             2011-04-26
24812   Bar             2011-04-26
24813   Bars            2011-04-27

变成这种格式:

date + Q + 4 digit ID sequence start from first ~ last

结果是:

id              name            date
20110426Q0001   Foo             2011-04-26
20110426Q0002   Bar             2011-04-26
20110427Q0001   Bars            2011-04-27 

但我只有一半的查询,如何制作 4 位数?

SELECT REPLACE( CONCAT( DATE( Inspection_datetime ) ,'Q',/*missing this query..*/),'-','') AS id,
       name,date
FROM mytable

尝试下面的答案后:

row @g:= `date`         id              Model           Serial      Lot_no  Inspection_datetime
1   2011-01-31 07:44:21 20110131Q0001   KW-HDR81BTJD    176X0099    010A    2011-01-31 07:44:21
1   2011-01-31 08:31:31 20110131Q0001   KW-HDR81BTJD    176X0098    010A    2011-01-31 08:31:31
1   2011-01-31 08:34:57 20110131Q0001   KW-HDR81BTJD    176X0065    010A    2011-01-31 08:34:57
1   2011-01-31 08:46:43 20110131Q0001   KW-HDR81BTJD    176X0050    010A    2011-01-31 08:46:43

【问题讨论】:

    标签: mysql sequence concat


    【解决方案1】:

    你可以使用用户定义的变量来做

    select 
    @r:= case when @g = date then @r +1 else 1 end rownum,
    @g:= date,
    REPLACE( CONCAT( 
      DATE(date) ,
      'Q'
      ,lpad(@r,4,'0')
      ),'-','') AS id,
    name,
    date
    from mytable
    cross join (select @g=null, @r:= 0) t
    order by date
    

    DEMO

    如果您只关心日期部分而不关心时间部分,那么您可以这样做

    select 
    @r:= case when @g = date(date) then @r +1 else 1 end rownum,
    @g:= date(date),
    REPLACE( CONCAT( 
      DATE(date) ,
      'Q'
      ,lpad(@r,4,'0')
      ),'-','') AS id,
    name,
    date
    from mytable
    cross join (select @g=null, @r:= 0) t
    order by date
    

    DEMO

    【讨论】:

    • UPDATE 也可以吗?
    • @nunu 是的,您为什么要更新 id 列?如果您想以问题中的格式显示某些内容,请保持原样并使用选择查询
    • @Khalid 如果我将列设置为自动增量,有时某些 id 会变得太长。
    • @nunu 如您所愿,您可以在我的回答中使用类似的逻辑更新您的表格
    • 我试过了,但在我的实际数据库中似乎不起作用。请参阅我更新的帖子。
    【解决方案2】:

    我不知道为什么来自 Khalid 的两个查询在我的Mysql 中都不起作用。 即使我在sqlfiddle 尝试过,它也可以工作,但它不在我的数据库中。 一周后我为这个问题发疯了,我得到了答案:

    我正在使用 Khalid 的第二个答案,然后尝试删除:

    cross join (select @g=null, @r:= 0) t
    

    然后在选择之前添加:

    set @g=null,@r:= 0;
    

    【讨论】:

      猜你喜欢
      • 2021-03-03
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多