我“分组”了一个查询。这是一个带有版本的技术部分的查询。
像这样:
ID , GlobalID, Name , DateCreated
413, 17, Masterscrew , 17.10.2014
421, 17, Masterscrew , 28.10.2014
482, 29, Bluescrew , 11.08.2014
519, 17, Masterscrew B, 01.12.2014我们的目标是执行一个结果如下的查询:
GlobalID, Version, ID, Date
17, 1, Masterscrew, 413, 17.10.2014
17, 2, Masterscrew, 421, 28.10.2014
17, 3, Masterscrew B, 519, 01.12.2014
29, 1, Bluescrew, 482, 11.08.2014is的挑战范围是“版本”列。有什么咒语可以让MySQL施展魔法吗?
发布于 2015-02-03 08:39:48
这可以通过其中包含@ID变量的那些复杂查询之一来完成。
SELECT (@ID := IF(@Prev <> GlobalID, 1, @ID + 1)) version,
(@Prev := GlobalID) GlobalID,
Name,
ID,
STR_TO_DATE(DateCreated, '%d.%m.%Y') DateCreated
FROM parts,
( SELECT @ID := 0, @Prev := 0 ) A
ORDER BY GlobalID, ID就能达到目的。http://sqlfiddle.com/#!2/82a36/15/0
每当有一个具有相同GlobalID值的新行时,@ID变量就会递增,并在更改时重置为零。@Prev变量跟踪前一行的GlobalID值。
这一行初始化这两个变量。
( SELECT @ID := 0, @Prev := 0 ) Init不要更改SELECT中前两列的顺序,否则查询将不再有效。(这是一个可怕的MySQL攻击;其他RDMSs提供排名)。
发布于 2015-02-03 08:44:32
SET @VERSION_NUM=0;
SET @PREV_GLOBALID=0;
SELECT
ID,
IF(@PREV_GLOBALID!=GlobalID,@VERSION_NUM:=1, @VERSION_NUM:=@VERSION_NUM+1) as version,
@PREV_GLOBALID:=GlobalID as GlobalID,
name,
DateCreated
FROM parts
ORDER BY GlobalID ASC, id ASChttps://stackoverflow.com/questions/28288945
复制相似问题