代码之家  ›  专栏  ›  技术社区  ›  Kavinda Athapaththu

如何按用户id对表进行分组并获取另一列的最大值?

  •  0
  • Kavinda Athapaththu  · 技术社区  · 6 年前

    我有一个表(bitnami moodle中的scrom_scoes_track table),其中包括用户id和值列。表的结构如下。

    Table Structure

    SELECT 
       `userid`,
       `value`
    FROM 
      `mdl_scorm_scoes_track` 
    WHERE 
      `element`= 'cmi.core.score.raw' 
    

    上述查询的结果如下。 Query result 1

    SELECT 
       `userid`,
       MAX(`value`) 
    FROM 
       `mdl_scorm_scoes_track` 
    WHERE 
       `element`= 'cmi.core.score.raw' 
    GROUP BY 
       `userid` 
    

    上述查询的结果。 Query result 2

    这里的第一行是userid 2和值50。但是用户id 2的最大值应该是100。(如第二幅图所示)。对这个问题的任何帮助都非常感谢。

    5 回复  |  直到 6 年前
        1
  •  1
  •   juergen d    6 年前

    首先需要将字符串转换为数字。否则 max()

    SELECT userid, max(cast(value as unsigned))
    FROM mdl_scorm_scoes_track 
    WHERE element = 'cmi.core.score.raw'
    group by userid
    
        2
  •  2
  •   Gurinder Sason    6 年前

    不要对数字字段使用长文本。 或者在下面使用

    SELECT `userid`,MAX(cast(`value` as unsigned)) FROM `mdl_scorm_scoes_track` WHERE `element`= 'cmi.core.score.raw' GROUP BY `userid` 
    
        3
  •  1
  •   Mureinik    6 年前

    value 存储为 longtext ,所以当你申请 max 在它上面,你可以通过 命令。将其转换为整数可以解决以下问题:

    SELECT   `userid`,MAX(CAST(`value` AS UNSIGNED))
    FROM     `mdl_scorm_scoes_track`
    WHERE    `element`= 'cmi.core.score.raw'
    GROUP BY `userid` 
    
        4
  •  0
  •   paulslater19    6 年前

    我猜value列不是数字字段

    尝试投射值字段eg CAST(value AS UNSIGNED)

        5
  •  0
  •   Ahmad    6 年前

    不需要一个GROUP BY语句就可以做到这一点。

    SELECT 
       `userid`,
       `value`
    FROM 
      `mdl_scorm_scoes_track` as outer
    WHERE 
      `element`= 'cmi.core.score.raw' 
      and `value` = (
            select 
               max(`value`) 
            from 
              `mdl_scorm_scoes_track` as inner 
            where 
              inner.userid = outer.userid )