1

如果您发出这样的查询,我很熟悉 MySQL 遇到的问题:

SELECT `user_log`.`USER_NAME`, MAX(`user_log`.`ACCESS_DATE_TIME`), `user_log`.`COMPUTER_NAME`, `user_log`.`LOCATION`  
    FROM `user_log` 
    GROUP BY `user_log`.`USER_NAME` 
    ORDER BY `user_log`.`ACCESS_DATE_TIME` DESC

这不会像您想的那样返回与 MAX ACCESS_DATE_TIME 关联的 COMPUTER_NAME 和 LOCATION。它将返回由您的 GROUP BY 列(所有 USER_NAME)定义的集合中的第一个值。

因此,为了解决这个问题,我正在尝试构建一个链接 MAX...GROUP BY sql 的查询,其中一个选择我需要的所有列,其中 USER_NAME 和 ACCESS_DATE_TIME 属于获取用户 MAX 的集合...GROUP 语句。

这就是我所拥有的->

SELECT `user_log`.`USER_NAME`, `user_log`.`ACCESS_DATE_TIME`, `user_log`.`COMPUTER_NAME`, `user_log`.`LOCATION` 
FROM `user_log`.`user_log` 
JOIN (SELECT `user_log`.`USER_NAME`, MAX(`user_log`.`ACCESS_DATE_TIME`) as sub_max 
    FROM `user_log` 
    GROUP BY `USER_NAME` 
    ORDER BY sub_max DESC) as sub
WHERE (`user_log`.`USER_NAME` = sub.`USER_NAME` AND `user_log`.`ACCESS_DATE_TIME` = sub.sub_max)

但是,它不是很快......有没有更好的方法来做到这一点?我敢肯定,现在有人想出了一些东西……

4

2 回答 2

1

将性能与临时表进行比较(未经测试):

CREATE TEMPORARY TABLE `user_log_temp` ENGINE=memory
SELECT `user_log`.`USER_NAME`, MAX(`user_log`.`ACCESS_DATE_TIME`) as sub_max 
FROM `user_log` 
GROUP BY `USER_NAME`;

SELECT `user_log`.`USER_NAME`, `user_log`.`ACCESS_DATE_TIME`, `user_log`.`COMPUTER_NAME`, `user_log`.`LOCATION` 
FROM `user_log`.`user_log` 
JOIN `user_log_temp` as sub 
  ON `user_log`.`USER_NAME` = sub.`USER_NAME`
  AND `user_log`.`ACCESS_DATE_TIME` = sub.sub_max;

DROP TABLE `user_log_temp`;
于 2012-09-28T15:44:26.080 回答
0

这就是我最终实施的 ->

使用 MAX...GROUP BY 关系创建表 ->

CREATE TABLE `user_log_max`
   SELECT
     `USER_NAME`, 
      /* Alias this calculated value as ACCESS_DATE_TIME */
      MAX(`ACCESS_DATE_TIME`) AS `ACCESS_DATE_TIME` 
   FROM `user_log`
   GROUP BY `USER_NAME`

获取所有数据 ->

SELECT DISTINCT `user_log`.`COMPUTER_NAME`, `user_log`.`LOCATION`, `user_log`.`USER_NAME`, `user_log`.`ACCESS_DATE_TIME` 
FROM `user_log`, `user_log_max`
WHERE `user_log_max`.`USER_NAME` = `user_log`.`USER_NAME` AND `user_log_max`.`ACCESS_DATE_TIME ` = `user_log`.`ACCESS_DATE_TIME`

确保添加正确的索引,否则它仍然会很慢。

如果你愿意,你也可以在完成后放下桌子,因为随着时间的推移它不会是相关的 ->

DROP TABLE `user_log_max`
于 2012-09-28T16:52:34.570 回答