来自另一个表的最近相关条目

时间:2015-02-05 21:26:49

标签: mysql sql

我有一张用户表(1,000个)和一个用户消息表(100,000个)。我想快速获取所有用户及其最新消息。

我目前正在使用的是......

SELECT 
   u.id, u.name, 
   (
      SELECT note FROM msgs 
      WHERE msgs.uID=u.id 
      ORDER BY created_date DESC
      LIMIT 1
   ) as note
FROM users u

现在,如果我将其限制为20个用户,则需要2.5秒... 200个用户需要45秒。

(我已经在msgs.uID和msgs.created_date上有一个INDEX。)

我做错了什么?我需要更快的查询。

3 个答案:

答案 0 :(得分:1)

我在发布之前进行了搜索(没有运气),但在发布之后在“相关”侧边栏中找到了this solution

SELECT    u.id, u.first_name, msgs.note
FROM      users u
JOIN      (
              SELECT    MAX(created_date) max_date, user_id 
              FROM      msgs 
              GROUP BY  user_id
          ) msgs_max ON (msgs_max.user_id = u.id)
JOIN      msgs m ON (msgs.created_date = msgs_max.max_date AND u.id = msgs.user_id)

相当好,但我的桌子上还是~1.3秒。 MySQL不能更快地做到这一点吗?

答案 1 :(得分:0)

select users.*, msgs2.* from users inner join ( select msgs.* from msgs inner join ( select max(created_date) as dt, user_id from msgs group by user_id ) last_dt on msgs.user_id = last_dt.user_id and msgs.created_date = last_dt.dt ) msgs2 on users.id = msgs2.user_id

试试这个,对不起,如果这可能有一些语法错误,或者也可能工作缓慢,我直接编写此查询,无需任何测试。

试试吧。

答案 2 :(得分:0)

只有两个连接的解决方案

SELECT u.id,u.name,msgs_max.note FROM users u JOIN
(SELECT m1.uID, m1.note FROM msgs m1 LEFT JOIN msgs m2
ON (m1.created_date < m2.created_date 
AND m1.uID = m2.uID)
WHERE m2.id IS NULL) msgs_max
ON u.uID=msg_max.uID

参考:https://stackoverflow.com/a/123481/2180715