对此我需要重新审视。我有两个表,一个表有用户,第二个表包含登录记录,每个用户有多个记录。我想做的是从第一个表中选择 all 项,并从第二个表中选择最新记录,例如,所有用户的列表,但仅显示最新活动。这两个表在ID列中都有自动递增。
我的代码因此是:
SELECT u.user_id, u.name, u.email, r.rid, r.user_id
FROM users AS u
LEFT JOIN login_records AS r ON r.user_id = u.user_id
WHERE
r.rid = (
SELECT MAX( rid )
FROM login_records
WHERE user_id = u.user_id
)
我已经在SO上搜索了类似问题的答案并尝试了所有问题,但是结果要么没有返回结果,要么只是得到了奇怪的结果(不一定是最新的结果)。两个表中的ID都是自动递增的,因此我认为获取特定用户的唯一ID或最高ID是相对简单的事情,但每次都不返回或完全不同的选择。
这是我第一次使用JOIN-我输入的JOIN错误吗?我需要对订单进行不同的订购或分组吗?
感谢您的帮助。这一定很简单,因为Danny Coulombe的答案appearing here似乎对其他用户有用。
答案 0 :(得分:1)
我相信您将需要一个子查询:
https://www.db-fiddle.com/f/2wudMDVxReYJz4FEyG19Va/0
CREATE TABLE users (
user_id INT UNSIGNED NOT NULL
AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE users_logins (
user_login_id INT UNSIGNED NOT NULL
AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL
);
INSERT INTO users SELECT 1;
INSERT INTO users SELECT 2;
INSERT INTO users_logins SELECT 1,1;
INSERT INTO users_logins SELECT 2,1;
INSERT INTO users_logins SELECT 3,1;
INSERT INTO users_logins SELECT 4,1;
INSERT INTO users_logins SELECT 5,2;
INSERT INTO users_logins SELECT 6,2;
查询:
SELECT
u.user_id, ul.latest_login_id
FROM users u
LEFT JOIN
(
SELECT user_id, MAX(user_login_id) latest_login_id
FROM users_logins
GROUP BY user_id
) ul ON u.user_id = ul.user_id
答案 1 :(得分:0)
如何用rid
替换where子句和相关子查询中的所有record_id
?
SELECT u.user_id, u.name, u.email, r.rid, r.record_id, r.user_id
FROM test_users AS u
LEFT JOIN test_login_records AS r ON r.user_id = u.user_id
WHERE
(r.record_id = (
SELECT MAX(record_id)
FROM test_login_records
WHERE user_id = u.user_id
) OR r.record_id is null);
测试here
答案 2 :(得分:0)
您必须 ORDER BY ,并按desc显示要显示的列,例如 ORDER BY last_login DESC 。
使用要订购的列更改last_login列,但是必须先在 SELECT 之后声明last_login列。