在mysql中每个组的行号

我想根据这个场景产生查询结果,根据crew_id和type来创build行号。

id crew_id amount type 1 4 1000 AUB 2 4 1500 AUB 3 5 8000 CA 4 4 1000 CA 5 5 1000 AUB 6 6 3000 AUB 7 4 2000 CA 8 6 3500 AUB 9 4 5000 AUB 10 5 9000 CA 11 5 1000 CA 

OUTPUT必须是ff:

 id crew_id amount type row_number 1 4 1000 AUB 1 2 4 1500 AUB 2 9 4 5000 AUB 3 4 4 1000 CA 1 7 4 2000 CA 2 5 5 1000 AUB 1 3 5 8000 CA 1 10 5 9000 CA 2 11 5 1000 CA 3 6 6 3000 AUB 1 6 6 3000 AUB 2 

我只想在这个输出中使用一个select语句

这个问题是相当古老的。 但我想张贴,以防有人会有同样的问题。

首先,描述的答案不正确。 例如,为

 id crew_id amount type 1 4 1000 AUB 2 4 1500 AUB 5 5 1000 AUB 6 6 3000 AUB 8 6 3500 AUB 9 4 5000 AUB 

(我只是删除行types'CA')结果表将是

 id crew_id amount rank type 1 4 1000 1 AUB 2 4 1500 2 AUB 9 4 5000 3 AUB 5 5 1000 4 AUB 6 6 3000 5 AUB 8 6 3500 6 AUB 

所以实际上它不使用crew_id和type,它只是使用types。

下面是我如何解决这个问题(可能有一个更优雅的方式来做比使用两个嵌套的'CASE的,但你得到的想法):

 SELECT id, amount, CASE crew_id WHEN @curCrewId THEN CASE type WHEN @curType THEN @curRow := @curRow + 1 ELSE @curRow := 1 END ELSE @curRow :=1 END AS rank, @curCrewId := crew_id AS crew_id, @curType := type AS type FROM Table1 p JOIN (SELECT @curRow := 0, @curCrewId := 0, @curType := '') r ORDER BY crew_id, type 

主要的想法依然存在。 我刚刚添加了一个variables@curCrewId。 如果有人需要使用3个variables进行分组,那么只需使用3个variables和3个嵌套的CASE。 🙂

请通过我的小提琴

这一个最后尝试

  SELECT id, crew_id, amount, type, ( CASE type WHEN @curType THEN @curRow := @curRow + 1 ELSE @curRow := 1 AND @curType := type END ) + 1 AS rank FROM Table1 p, (SELECT @curRow := 0, @curType := '') r ORDER BY crew_id,type asc; 

@ Janty的答案不起作用时,types以数字开始(排名从2开始,而不是1)。

请改用以下内容:

 SELECT id, crew_id, amount, CASE type WHEN @curType THEN @curRow := @curRow + 1 ELSE @curRow := 1 END AS rank, @curType := type AS type FROM Table1 p JOIN (SELECT @curRow := 0, @curType := '') r ORDER BY crew_id, type 

除了@Janty的答案以外,如果你想用rownumber指定你的表,

 UPDATE myTable mt,(SELECT @curRow := 0, @curType := '') r SET type= ( CASE type WHEN @curType THEN @curRow := @curRow + 1 ELSE @curRow := 1 AND @curType := type END ) ; 

因为太太crewId不在。 如其他答案中提到的那样,使用第二个“案例”。

 SELECT id, crew_id, amount, type, ( CASE type WHEN @curType THEN @curRow := @curRow + 1 ELSE @curRow := 1 AND @curType := type END ) + 1 AS rank FROM Table1 p, (SELECT @curRow := 0, @curType := '') r ORDER BY crew_id, type asc; 

这里是我的答案只使用一个案例 ,根据两列创build行号:

 SELECT id, crew_id, amount, type, (CASE CONCAT(crew_id, type) WHEN @cur_crew_type THEN @curRow := @curRow + 1 ELSE @curRow := 0 END) + 1 AS cnt, @cur_crew_type := CONCAT(crew_id, type) AS cur_crew_type FROM TABLE t, (SELECT @curRow := 0, @cur_crew_type := '') counter ORDER BY crew_id, type;