在MySQL中按顺序、分组和按日期枚举记录

在MySQL中按顺序、分组和按日期枚举记录,mysql,group-by,enumerate,Mysql,Group By,Enumerate,这似乎是一个很简单的问题,我害怕自己会被重复的问题锤砸到,但我得到的是: ID Date 1 1/11/01 1 3/3/03 1 2/22/02 2 1/11/01 2 2/22/02 我所需要做的就是根据日期枚举记录,并按ID进行分组!因此: ID Date Num 1 1/11/01 1 1 3/3/03 3 1 2/22/02 2 2 1/11/01 1 2 2/22/02 2 这非常类似于,但对我不起作用。很好,但不是MySQL

这似乎是一个很简单的问题,我害怕自己会被重复的问题锤砸到,但我得到的是:

ID  Date
1   1/11/01
1   3/3/03
1   2/22/02
2   1/11/01
2   2/22/02
我所需要做的就是根据日期枚举记录,并按
ID
进行分组!因此:

ID  Date    Num
1   1/11/01 1
1   3/3/03  3
1   2/22/02 2
2   1/11/01 1
2   2/22/02 2
这非常类似于,但对我不起作用。很好,但不是MySQL

我曾尝试使用
分组方式
,但它不起作用,如中所示

SELECT ta.*, count(*) as Num
FROM temp_a ta
GROUP BY `ID` ORDER BY `ID`;  
这显然不会运行,因为
GROUP BY
总是得到一个值


非常感谢您的建议。

我们假设下表为:

CREATE TABLE q43381823(id INT, dt DATE);
INSERT INTO q43381823 VALUES
(1, '2001-01-11'),
(1, '2003-03-03'),
(1, '2002-02-22'),
(2, '2001-01-11'),
(2, '2002-02-22');
然后,编写查询以获得所需输出的方法之一是:

SELECT q.*,  
    CASE WHEN (
            IF(@id != q.id, @rank := 0, @rank := @rank + 1)
         ) >=1 THEN @rank
         ELSE @rank := 1 
    END as rank,
    @id := q.id AS buffer_id
FROM q43381823 q
CROSS JOIN (
    SELECT  @rank:= 0, 
        @id  := (SELECT q2.id FROM q43381823 AS q2 ORDER BY q2.id LIMIT 1)
    ) x
ORDER BY q.id, q.dt
输出:

您可以忽略输出中的
buffer\u id
列-它与结果无关,但需要重置
rank



说明:

  • @id
    变量根据输出的排序顺序跟踪行中的每个id。在初始迭代中,我们将其设置为最终结果中可能获得的第一条记录的
    id
    。请参见子查询
    从q43381823中选择q2.id作为q2订单,按q2.id限制1

  • @rank
    最初设置为
    0
    ,默认情况下,对于结果集中的每个后续行,都会递增。但是,当
    id
    更改时,我们将其重置为
    1
    。请参阅此查询中的
    CASE-WHEN-ELSE
    构造

  • 最终输出首先按
    id
    排序,然后按
    dt
    排序。这可确保在同一
    id
    内的每个后续
    dt
    字段中增量设置
    @rank
    ,但每当新的
    id
    组开始显示在结果集中时,会重置为
    1


我爱你!非常感谢你。我永远也想不到这一点。特别感谢你的精彩解释,谢谢。很高兴它有帮助!这太复杂了,你能解释一下整个案子是怎么运作的吗?(尤其是if,它对我来说毫无意义,当我从if中删除其中一个“参数”时,它返回一个错误)@Barbz_YHOOL MySQL不支持行秩,因此我们使用上面的
CASE-when
构造来模拟它。您可以如下阅读:
当(x>=1)使用@rank时,否则(即默认值)将@rank初始化为1
。您会注意到,
x
实际上是
IF(条件,true,false)
。也就是说,
如果当前行的id(qid)与前一行的id(@id)不同,则将“x”重置为0,否则将“x”增加1
。这会在
id
发生更改时将
@rank
重置为
1
,否则它会不断增加。请注意,当
如果
返回
x
0
时,
案例
立即使用
默认值
将其设置为
1
@Barbz_YHOOL Yes,您是对的。在这种特殊情况下,需要将行枚举为1、2、3。。。。请参阅此页了解有关MySQL
IF()
函数的更多信息。如果这篇文章有帮助的话,那肯定是个好消息。谢谢但是,如果你认为你可能想得到一个关于代码是否有效的意见,你可以考虑为你的具体问题发布一个新的问题。谁知道呢,也许有一种更简单的方法可以得到你想要的东西?
  id  |    dt        |   rank  |    buffer_id 
-------------------------------------------------    
  1   |  2001-01-11  |    1    |       1    
  1   |  2002-02-22  |    2    |       1
  1   |  2003-03-03  |    3    |       1
  2   |  2001-01-11  |    1    |       2
  2   |  2002-02-22  |    2    |       2