我将查询“分组”。这是带有版本的技术零件的查询。

喜欢:

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提供了排名)。

10-01 14:22