获取 ID 列表的行,其中特定字段在 MySQL 数据库中为最大值

Posted

技术标签:

【中文标题】获取 ID 列表的行,其中特定字段在 MySQL 数据库中为最大值【英文标题】:Get row for a list of id's where a specific field is max in a MySQL database 【发布时间】:2016-03-17 10:39:28 【问题描述】:

我不知道我是否在标题中正确描述了这个问题,但在这里。

我在 mysql 数据库中有以下表:

路线点:

   routepoint_id | route_id |    latitude    |     longitude     | location | routepoint_time
_________________|__________|________________|___________________|__________|__________________
        24       |   38     |   9.32454363   |    10.65785453    |   blah   |     1232455678
        25       |   38     |  56.72112300   |    11.40735700    |   blah   |  3324546454363
        26       |   39     |  12.83276562   |    12.83276562    |   blah   |    54321325541
        27       |   39     |  52.72112300   |    10.23400000    |   blah   |    64321325541     
_________________|__________|________________|___________________|__________|__________________
                 |          |                |                   |          |

还有路线

   route_id    |  user_id  | creation_date  
_______________|___________|________________
      38       |    18     |    1243256576   
      39       |    16     | 3463468576543 
_______________|___________|________________  
               |           |

我想要做的是: 从 routepoints 表中为给定的 user_id 列表选择数据,其中 routepoint_time 具有最大值。

我正在尝试通过 php 和 Mysqli 来实现这一点,其中我为以下查询提供了一个 user_id 数组:

$stmt = $this->con->prepare("SELECT routes.user_id, routepoints.latitude, routepoints.longitude, MAX(routepoints.routepoint_time) AS maxTime, users.status
                            FROM routepoints
                            INNER JOIN routes ON routepoints.route_id = routes.route_id
                            INNER JOIN users ON routes.user_id = users.user_id
                            WHERE routes.user_id IN ($idArray)
                            GROUP BY routes.user_id");
            $stmt->execute();
            $stmt->store_result();
            $stmt->bind_result($user_id, $latitude, $longitude, $routePointTime, $status);

以上查询返回如下结果:


  "status": true,
  "friendsLocationList": [
    
      "userId": 16,
      "latitude": 12.83276562,
      "longitude": 12.83276562,
      "routePointTime": "64321325541",
      "onlineStatus": 0
    ,
    
      "userId": 18,
      "latitude": 9.32454363,
      "longitude": 10.65785453,
      "routePointTime": "3324546454363",
      "onlineStatus": 0
    
  ]

如您所见,问题在于它返回了最大的 routepoint_time 值,但它与其他关联值(纬度、经度等)不匹配。

我怎样才能做到这一点?

我希望你能理解我想要达到的目标。任何帮助将不胜感激。

【问题讨论】:

这个问题被问到和回答得如此频繁,以至于它变得无聊 @Strawberry,指向重复,让我们结束问题。 @innoSPG 为规范问题建立一个更好的系统,我会 @strawberry:看看你的用户资料,你似乎比我更有经验。由于您之前的答案之一似乎已经解决了这个问题(我确信以一种更高效的方式),所以在这里链接到它怎么样(它是规范的吗?idk)。 手册是这样说的:dev.mysql.com/doc/refman/5.7/en/… 【参考方案1】:

编辑: 如果您对可能的最佳性能不感兴趣,请仅在我的回答中使用该解决方案。否则,请查看 mysql 手册(由草莓在 cmets 中发布的问题链接)。

SELECT
    R.user_id,
    RP.route_id,
    RP.latitude,
    RP.longitude,
    RP.routepoint_time AS maxTime

FROM routepoints AS RP

    INNER JOIN routes AS R
    ON RP.route_id = R.route_id

    INNER JOIN users
    ON R.user_id = users.user_id

WHERE
    RP.routepoint_time = (
        SELECT max(RP2.routepoint_time)
        FROM routepoints AS RP2
        WHERE RP2.route_id = RP.route_id
    )
    R.user_id IN (16,18)

遍历路由点表中的每条记录。 where-condition 的 subselect 从第一个循环中找到属于当前 Route 的最长路由点,并确保只选择具有该时间的路由点。

我不确定这是否适用于所有情况,因为在我看来 where 条件在某些极端情况下不起作用。

【讨论】:

感谢您的帮助。我现在开始工作了!虽然它没有立即工作。 “routes.user_id”应更改为“R.user_id”。我还将 user_id 的数组添加到 where 子句中,因为我只需要那些在数组中指定了 user_id 的行。无论如何,我用一堆不同的场景对其进行了测试,直到现在它已经按预期工作了。接受 +1 是的,我对可能的最佳性能感兴趣。接下来我会研究这个问题,但仍将其作为临时解决方案。 很高兴你们投票支持。应用您的更正和用户标准。将尝试为草莓建议的性能更高的查询提供解决方案。第一次尝试没有按预期工作。是否有其他人愿意(我当然会赞成)。

以上是关于获取 ID 列表的行,其中特定字段在 MySQL 数据库中为最大值的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 如何选择表中的行,其中 id 值位于另一个表中的逗号分隔字段中?

获取选择菜单以根据 MySQL SELECT 结果动态显示特定的选择选项

我无法使用 jQuery 发布特定行并获取字段的值,我获取第一行的值而不是提交的行

从非常大的 Mysql 数据库中获取“文本”列字段的行

获取具有特定数量的重复值的行

MySql 查询从好友表中获取好友列表