MySQL自定义变量增量

时间:2012-02-01 21:14:21

标签: mysql

我遇到与Select incremented integer类似的问题,但我正在尝试更进一步。

我有一个表(跟踪某些代码更改的历史记录表),其中包括ID(id),修改后的时间戳(已修改)和来自另一个表(company_id)的外键。如果我指定一个company_id,我可以通过查询将值编号从1增加到X,这样可以对发生的项目进行排序,但它仅适用于特定的company_id。

所以这......

    SELECT id, (@rev := @rev+1) AS revision, company_id
    FROM code_history AS ch
    INNER JOIN (SELECT @rev := 0) AS r
    WHERE company_id = '1'

...返回

    ID | revision | company_id
     1 |    1     |     1
     3 |    2     |     1
     4 |    3     |     1
     7 |    4     |     1
     9 |    5     |     1
    12 |    6     |     1

我不知道的是如何制作它,以便每个独特的company_id都有自己增加的ID和修订版计数列表,而无需为每个company_id查询数据库,或者即使它是可能的。

我想要的数据......

    ID | revision | company_id
     1 |    1     |     1
     3 |    2     |     1
     4 |    3     |     1
     7 |    4     |     1
     9 |    5     |     1
    12 |    6     |     1
     2 |    1     |     2
     8 |    2     |     2
    13 |    3     |     2
    18 |    4     |     2
    19 |    5     |     2
    21 |    6     |     2
     5 |    1     |     3
     6 |    2     |     3
    10 |    3     |     3
    11 |    4     |     3
    14 |    5     |     3

感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:3)

你走在正确的轨道上,你只需要第二个变量来保留最后的公司ID,然后将计数器重置为1

SELECT 
      PreSortedRevisions.id, 
      @rev := if( @lastCompany = PreSortedRevisions.company_id, @rev+1, 1 ) AS revision, 
      @lastCompany := company_id as Company_ID
   FROM 
      ( select ch.company_id,
               ch.id 
            from code_history AS ch
            order by ch.company_id,
                     ch.id ) PreSortedRevisions,
      (SELECT @rev := 0, @lastCompany := 0) AS SqlVars
   order by
      Company_id,
      Revision

首先,内部查询预先收集记录并按公司和ID对它们进行排序,以便按公司的正确顺序返回。

然后,通过在@LastCompany:= company_id赋值之前测试IF(),@ LastCompany从0开始,并且在第一次启动@rev = 1时会有所不同。在第一个记录之后,@ LastCompany现在将是最后一个,在记录2上是相同的,并增加计数器。当公司实际发生变化时,它会将计数器重置为1。