很抱歉在这里问这个问题,但我对 JOIN 的理解相当不稳定,几个小时的混乱并没有让我有任何结果。这是我已经设置的以及我需要的:
我有三张表,每一张用于用户、位置和签到。每次用户前往某个位置时,他们都可以在那里签到。签到表示例如下:
+------------+---------+-------------+---------------------+
| checkin_id | user_id | location_id | timestamp |
+------------+---------+-------------+---------------------+
| 18 | 99 | 1 | 2011-07-10 16:15:59 |
| 14 | 6 | 2 | 2011-07-10 04:49:53 |
| 17 | 6 | 5 | 2011-07-10 16:15:46 |
| 16 | 99 | 7 | 2011-07-10 16:14:00 |
| 19 | 99 | 2 | 2011-07-10 16:16:27 |
+------------+---------+-------------+---------------------+
正如您所看到的,将有一个用户的多个实例和多个位置的实例。我需要弄清楚如何为签入表中存在的每个用户找出他们最近签入某处的时间。例如,在本例中,用户 99 最近的签到是在位置 2(签到 ID 19),用户 6 最近的签到是在位置 5(签到 ID 17)。我只想要每个用户最近的签到。有没有办法可以直接从 MySQL 获取这个?如果是这样,怎么办?
在此先感谢您的帮助。 :)
SELECT *
FROM checkins AS c
JOIN (
SELECT user_id,MAX(`timestamp`) AS `timestamp`
FROM checkins
GROUP BY user_id
) AS x ON (x.user_id = c.user_id AND x.`timestamp`=c.`timestamp`);
EDIT:按要求解释:
-
内部查询:
SELECT user_id,MAX(`timestamp`) AS `timestamp`
FROM checkins
GROUP BY user_id;
单独运行此查询以查看输出,但它为每个 user_id 选择最大时间戳值。然后,通过将其插入子选择,我们将结果视为一个单独的表以用于 JOIN 的目的
-
外部查询:
SELECT *
FROM checkins AS c
JOIN (...) AS x ON (x.user_id = c.user_id AND x.`timestamp`=c.`timestamp`);
这连接了原始表checkins别名为c(为了更容易输入)使用第一个查询的结果,使用别名x。通过执行标准联接,仅显示两个表中都有结果的行,因此我们可以有效地使用联接来过滤掉不需要的行。
最终结果是您将看到与内部查询中的 user_id 和 MAX(timestamp) 匹配的所有行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)