我想念什么? MySQL从第二张表中退出加入最新条目

时间:2018-09-08 18:56:07

标签: mysql left-join

对此我需要重新审视。我有两个表,一个表有用户,第二个表包含登录记录,每个用户有多个记录。我想做的是从第一个表中选择 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似乎对其他用户有用。

3 个答案:

答案 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列。