MYSQL从表中选择最新条目并引用另一个表的最新条目

MYSQL从表中选择最新条目并引用另一个表的最新条目,mysql,Mysql,我有这些桌子: 行动表: +------+-------+--------------------------------------+ | id | action | contact_list_id | +------+-------+--------------------------------------+0 | 1 | 1 | 1234

我有这些桌子:

行动表:

       +------+-------+--------------------------------------+
       | id   | action   | contact_list_id                   |
       +------+-------+--------------------------------------+0
       | 1    | 1        | 1234                              |
       | 2    | 1        | 1235                              |
       | 3    | 2        | 1234                              |
       | 4    | 3        | 1235                              |
       +------+-------+--------------------------------------+
联系人列表表:

       +------+-------+--------------------------------------+
       | id   | user_id | updated_by                         |
       +------+-------+--------------------------------------+0
       | 1234 | 1        | 1                                 |
       | 1235 | 1        | 1                                 |
       | 1236 | 2        | 1                                 |
       +------+-------+--------------------------------------+
我必须找到只返回一行的最新操作表条目 拥有用户_id=1

我尝试了这个,但没有返回正确的结果:

SELECT a.*
FROM contact_list a
INNER JOIN (
    SELECT MAX(id)
    FROM action
    GROUP BY id
) b ON a.id = b.id
WHERE user_id = 1
预期结果:

       +------+-------+--------------------------------------+
       | id   | action   | contact_list_id                   |
       +------+-------+--------------------------------------+0
                                 |
       | 4    | 3        | 1235                              |
       +------+-------+--------------------------------------+
我猜最新的意思是拥有最大的
id
值。请记住,表中的行没有固有的顺序。你总是要说出你所说的最新和最早的意思

让我们一点一点地解决这个问题

首先,使用子查询获取每个联系人列表id的最大action.id

                  SELECT MAX(id) id, contact_list_id
                    FROM action 
                   GROUP BY contact_list_id
接下来,使用该子查询从操作表中取出所需的行

       SELECT action.id, action.action, action.contact_list_id
         FROM action
         JOIN (
                  SELECT MAX(id) id, contact_list_id
                    FROM action 
                   GROUP BY contact_list_id
              )maxaction ON action.contact_list_id = maxaction.contact_list_id
接下来,将其连接到联系人表,并添加WHERE子句以获取所需的行

       SELECT action.id, action.action, action.contact_list_id
         FROM action
         JOIN (
                  SELECT MAX(id) id, contact_list_id
                    FROM action 
                   GROUP BY contact_list_id
              ) maxaction ON action.contact_list_id = maxaction.contact_list_id
         JOIN contact ON action.contact_list_id = contact.contact_list_id
        WHERE contact.user_id = 1
总结:

  • 查找“最新”行的
    id
  • 使用联接从最新的行中查找详细信息
  • 加入另一个表以获取用户id值
  • 使用WHERE子句筛选所需的用户id

  • 您可以使用下一个解决方案来解决您的问题:

    SELECT * 
    FROM action 
    WHERE id = (
        -- here sub-query for get last action id for user 1
        SELECT MAX(action.id)
        FROM `action`
        JOIN contact_list ON contact_list.id = action.contact_list_id
        WHERE user_id = 1
    );
    

    您可以在

    上测试查询,请参见:请提供所需结果您应该在
    联系人列表\u id
    上加入表
    操作
    ,而不是在
    id
    上加入表。