我将查询“分组”。这是带有版本的技术零件的查询。
喜欢:
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.2014
面临的挑战是“版本”(Version)-列。我可以投给MySQL做魔术的任何咒语吗?
最佳答案
这可以通过其中包含@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
每当有新的行具有相同的
@ID
值时,GlobalID
变量就会递增,并在更改时重置为零。 @Prev
变量跟踪上一行的GlobalID
值。这行初始化这两个变量。
( SELECT @ID := 0, @Prev := 0 ) Init
不要更改SELECT中前两列的顺序,否则查询将不再起作用。 (这是一个严峻的MySQL hack;其他RDMS提供了排名)。