我遇到与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
感谢您的帮助,谢谢!
答案 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。