【问题标题】:Smart select from MySQL从 MySQL 中智能选择
【发布时间】:2013-09-17 16:23:59
【问题描述】:

我不擅长 MySQL,所以我需要你的帮助。

我有带列的表格

logId, playerId, playerName, updateTime

logId 是主要的并且是自动递增的。 playerId 是 int(11) playerName 是 varChar(36) updateTime 也是 int(输入时存储 unix 时间戳)

我在数据库中有这些条目:

1, 444, 约翰, 1379434514

2, 444, 约翰, 1379434414

3, 445, 迈克, 1379434410

4, 444, 约翰, 1379434614

我只想为每个唯一的 playerId 获取一个,在“updateTime”列中具有最大整数(在本例中,它是 logId 为 4 的 playerId 为 444)。

有什么方法可以将特定 playerId 的所有条目分组,然后只选择其中一个(最新的)? 谢谢!

【问题讨论】:

    标签: mysql select count unique


    【解决方案1】:

    您想要groupwise maximum,可以通过将您的表与为每个组选择标识(最大)updateTime 的子查询连接来获得:

    SELECT * FROM my_table NATURAL JOIN (
      SELECT playerId, MAX(updateTime) updateTime FROM my_table GROUP BY playerId
    ) t
    

    sqlfiddle 上查看。

    请注意,您确实应该使用 MySQL 的 TIMESTAMP 类型作为 updateTime;而且我怀疑playerName可能违反2NF

    【讨论】:

    • 就是这样,非常感谢!为什么要使用 MySQL 的 TIMESTAMP 来更新时间?在 PHP 中使用 time() 有什么问题?
    • 查询末尾的“t”是什么意思?
    • @ToniPerić:t 是给从子查询具体化的表的别名;它可以是你想要的任何东西。
    • @ToniPerić:最好使用TIMESTAMP,这样您就可以在MySQL中本地执行日期/时间操作,而无需先转换; MySQL还将为您处理与您的会话时区的转换;如果需要,可以将 MySQL 配置为在创建/修改记录时自动为您设置/更新值。
    【解决方案2】:

    如果我理解正确,你可以简单地写:

    select max(updateTime) 
    from t1 
    group by playerId
    

    SQLFiddle

    【讨论】:

    • 我认为OP还想要其他相应的字段,例如logId?
    • 但这只带回了 updateTime 列,我需要它们全部 (*) 其中 updateTime 是一组一个 playerId 的最大数字
    • 感谢您的澄清 - 为@eggyal +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多