【问题标题】:get lowest value while using group by and order by使用 group by 和 order by 时获得最低值
【发布时间】:2015-04-08 04:36:14
【问题描述】:

我有一张看起来有大约 50 行的表格。该表包含田径比赛的结果。这是结构:

我正在做的是获得每个事件的前十名。这是我目前所拥有的:

SELECT * FROM Times WHERE event='1600m' GROUP BY fname, lname ORDER BY time, event LIMIT 10

每个人都可以在每个事件的列表中出现一次。这行得通,但是如果您一直查看下面 1600m 的时间...

您可以看到Kyle Rummens 的时间为4:32:00。下图是上面sql语句的结果:

Kyle 的时间是 4:36:00

怎样才能让它成为1600米最快的前10名的名单event,每个人只能上榜一次,而且是每个人最快的时间

编辑:我被要求以文本而不是图像的形式添加我的结果,所以它们在这里:

这是上述查询的结果:

fname  lname       event time     meetName             date
====== =========== ===== ======== ==================== ==========
Jeron  Tucker      1600m 04:09:00 Coaches Meet         2015-02-12
Chris  Hughes      1600m 04:27:00 Distance Chalenge    2015-02-10
Andrew Rummens     1600m 04:28:00 Simplot Games        2015-02-20
Kyle   Rummens     1600m 04:36:00 Simplot Games        2015-02-19
Alex   Southerland 1600m 04:52:00 Coaches Meet         2015-02-12
Canyon Schmerse    1600m 04:54:00 Arcadia Invitational 2015-05-12
Joseph Stone       1600m 05:08:00 Coaches Meet         2015-02-12
Teron  Tucker      1600m 05:09:00 Harvard Track Meet   2015-02-19
Little Jacob       1600m 05:12:00 Arcadia Invitational 2015-05-12
Connor Kleinman    1600m 05:54:00 BYU Invitational     2015-04-03

【问题讨论】:

    标签: mysql sql group-by sql-order-by


    【解决方案1】:

    对每个游泳者使用min(time) 来找到每个游泳者的最快时间:

    SELECT fname, lname, min(time) as tune
    FROM Times
    WHERE event = '1600m'
    GROUP BY fname, lname
    ORDER BY time
    LIMIT 10
    

    也无需通过event 订购,因为它始终是'1600m'

    【讨论】:

    • 这就是为什么我更喜欢 DBMS'如果您使用不在group by 子句中的非聚合列会痛苦地抱怨:-)
    • @pax 阿门。这里有 1000 个 Q 存在,因为错误不存在。 MySQL 应该真正需要一个“免责声明”语法来让它通过,例如select * ... lenient group by x, y
    • 谢谢,查询效果很好。在将您标记为最佳答案之前,让我再测试一下
    【解决方案2】:

    使用相关子查询:

    SELECT t1.* 
    FROM Times t1
    WHERE t1.event='1600m' AND t1.time = (SELECT MAX(time)
                                          FROM Times t2
                                          WHERE t2.event='1600m' AND
                                                t1.fname = t2.fname AND
                                                t1.lname = t2.fname)
    ORDER BY t1.time
    LIMIT 10;
    

    【讨论】:

    • 查询返回零行
    • 您能否以文本形式发布您的示例数据?
    • 喜欢我附上的图片,但就像文字一样?
    • 是的,请将其添加到您的问题中。
    • 不是结果。您的原始样本数据。
    【解决方案3】:

    在 SELECT 后添加 DISTINCT

    SELECT DISTINCT * FROM Times WHERE event='1600m' GROUP BY fname, lname ORDER BY MIN(time) LIMIT 10
    

    【讨论】:

    • @phprunner 你得到什么输出?
    • 不。仍然没有kyle rummens的最低时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多