首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:在组内枚举(香蕉,1/香蕉,2/香蕉,3/苹果,1 ...)

MySQL:在组内枚举(香蕉,1/香蕉,2/香蕉,3/苹果,1 ...)
EN

Stack Overflow用户
提问于 2015-02-03 07:46:07
回答 2查看 56关注 0票数 0

我“分组”了一个查询。这是一个带有版本的技术部分的查询。

像这样:

代码语言:javascript
复制
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

我们的目标是执行一个结果如下的查询:

代码语言:javascript
复制
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

is的挑战范围是“版本”列。有什么咒语可以让MySQL施展魔法吗?

EN

回答 2

Stack Overflow用户

发布于 2015-02-03 08:39:48

这可以通过其中包含@ID变量的那些复杂查询之一来完成。

代码语言:javascript
复制
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值。

这一行初始化这两个变量。

代码语言:javascript
复制
 ( SELECT @ID := 0, @Prev := 0 ) Init

不要更改SELECT中前两列的顺序,否则查询将不再有效。(这是一个可怕的MySQL攻击;其他RDMSs提供排名)。

票数 2
EN

Stack Overflow用户

发布于 2015-02-03 08:44:32

代码语言:javascript
复制
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 ASC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28288945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档