代码之家  ›  专栏  ›  技术社区  ›  Tim

MySQL:max()和groupby的问题-值错误

  •  0
  • Tim  · 技术社区  · 16 年前

    我对SQL语句有问题:

    select a.id as ID, a.dur as DUR, DATE(FROM_UNIXTIME(timestampCol)) as date, 
     a_au.re as RE, a_au.stat as STAT from b_c
      inner join c on b_c.c_id = c.id
      inner join a on c.id = a.c_id
      inner join a_au on a.id = a_au.id
      inner join revi on a_au.rev = revi.rev
      where b_c.b_id = 5
    

    我得到这个结果:

    ID  DUR         date   RE  STAT
    -------------------------------
    31, 10, '2010-07-14', 2200, 0
    31, 10, '2010-07-14', 2205, 0
    31, 10, '2010-07-14', 2206, 2
    31, 10, '2010-07-14', 2207, 0
    31, 10, '2010-07-14', 2210, 2
    31, 10, '2010-07-15', 2211, 0
    31, 10, '2010-07-14', 2213, 1
    32, 10, '2010-07-14', 2203, 0
    32, 10, '2010-07-14', 2204, 0
    32, 10, '2010-07-14', 2208, 2
    32, 10, '2010-07-14', 2209, 0
    32, 10, '2010-07-15', 2212, 2
    

    现在我想得到一个ID和日期组合的结果行。我还想得到这个结果行的最高雷诺数。

    select a.id as ID, a.dur as DUR, DATE(FROM_UNIXTIME(timestampCol)) as date, 
     max(a_au.re) as RE, a_au.stat as STAT from b_c
      inner join c on b_c.c_id = c.id
      inner join a on c.id = a.c_id
      inner join a_au on a.id = a_au.id
      inner join revi on a_au.rev = revi.rev
      where b_c.b_id = 5
      group by ID, date
    

    现在我得到这个结果:

    ID  DUR         date   RE  STAT
    -------------------------------
    31, 10, '2010-07-14', 2213, 0
    31, 10, '2010-07-15', 2211, 0
    32, 10, '2010-07-14', 2209, 0
    32, 10, '2010-07-15', 2212, 2
    

    一切似乎都很好,我每天有一个结果行/ID组合和行与最高的重新编号。但是:列STAT没有正确的值!

    31, 10, '2010-07-14', 2213, 0
    

    必须具有状态1:

    31, 10, '2010-07-14', 2213, 1
    

    所以我的陈述肯定有错。似乎MySQL使用它找到的第一个STAT列值。但是我想要一个对应的。

    我在这里看到了其他的话题: Selecting all corresponding fields using MAX and GROUP BY 但是我不能把它转移到我的SQL语句中。

    提前多谢&致以最诚挚的问候。

    1 回复  |  直到 9 年前
        1
  •  1
  •   OMG Ponies    16 年前

    用途:

    SELECT a.id as ID, 
           a.dur as DUR, 
           DATE(FROM_UNIXTIME(timestampCol)) as date, 
           a_au.re as RE, 
           a_au.stat as STAT 
     FROM b_c
     JOIN c on b_c.c_id = c.id
     JOIN a on c.id = a.c_id
     JOIN a_au on a.id = a_au.id
     JOIN revi on a_au.rev = revi.rev
     JOIN ( SELECT a.id as ID, 
                   DATE(FROM_UNIXTIME(timestampCol)) as date, 
                   MAX(a_au.re) as Max_RE
              FROM b_c
              JOIN c on b_c.c_id = c.id
              JOIN a on c.id = a.c_id
              JOIN a_au on a.id = a_au.id
              JOIN revi on a_au.rev = revi.rev
             WHERE b_c.b_id = 5 
          GROUP BY a.id, DATE(FROM_UNIXTIME(timestampCol))) x ON x.id = a.id
                                                             AND x.date = DATE(FROM_UNIXTIME(timestampCol))
                                                             AND x.max_re = a_au.re
    WHERE b_c.b_id = 5