mysql - 无法在我的查询中集成 INNER JOIN

标签 mysql sql

您好,我正在使用下面的查询从每个唯一对话中选择最新消息。一切都很完美,除了当我尝试集成 INNER JOIN 来尝试将用户的 user_id 与其 usernameusers< 中链接起来时。/表。

我已经尝试了几乎所有组合来集成INNER JOIN,因此我决定将其与工作查询分开,直到获得帮助。

我做了一个 fiddle http://sqlfiddle.com/#!9/a9bbc/1我只想右边的user_id打印用户的用户名

SELECT message_id, 
       msg, 
       user_id 
FROM   messages 
   JOIN (SELECT user_id, 
                Max(dat) m 
         FROM   ((SELECT message_id, 
                         recipient_id user_id, 
                         dat 
                  FROM   messages 
                  WHERE  owner_id = 1) 
                 UNION 
                 (SELECT message_id, 
                         owner_id user_id, 
                         dat 
                  FROM   messages 
                  WHERE  recipient_id = 1)) t1 
         GROUP  BY user_id) t2 
     ON ( ( owner_id = 1 
            AND recipient_id = user_id ) 
           OR ( owner_id = user_id 
                AND recipient_id = 1 ) ) 
        AND ( dat = m ) 
 ORDER  BY dat DESC

.

users.username INNER JOIN users ON messages.user_id = users.user_id;

最佳答案

如果 messages.message_idAUTO_INCRMENT PRIMARY KEY 列,这可能是接收所需结果的最快方法:

select m.message_id, m.msg, u.username,
  case sub.other_user_id
    when m.owner_id     then 'received from'
    when m.recipient_id then 'sent to'
  end as direction
from (
  select other_user_id, max(message_id) as message_id
  from (
    select recipient_id as other_user_id, max(message_id) as message_id
    from messages
    where owner_id = @uid
    group by recipient_id

    union all

    select owner_id as other_user_id, max(message_id) as message_id
    from messages
    where recipient_id = @uid
    group by owner_id
  ) sub
  group by other_user_id
) sub
join messages m on m.message_id = sub.message_id
join users u    on u.user_id    = sub.other_user_id
order by sub.message_id desc

我还添加了方向列。这样您就可以知道消息是否已发送或接收。结果会是这样的:

| message_id |                                                              msg | username |     direction |
|------------|------------------------------------------------------------------|----------|---------------|
|          9 | You should also see this                                         |    User3 |       sent to |
|          8 | you should Now see this instead even with the owner_id flipped.. |    User2 | received from |

http://sqlfiddle.com/#!9/a9bbc/34

请注意,您仍然可以在 SELECT 子句中添加 usersmessages 表中的任何列。

要使此查询快速运行,您需要对 messages(owner_id,recipient_id)messages(recipient_id,owner_id) 建立索引。

关于mysql - 无法在我的查询中集成 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47361955/

相关文章:

sql - PostgreSQL 约束问题

PHP PDO 删除早于 'x'(用户定义)天的条目

mysql - 1970 年之前的默认日期值,默认值无效

mysql - 如何从主机连接到在 Docker 上运行的 MySQL

php - 如何在php mysql上设置主备数据库

sql - SQL 语句中不允许的本地集合类型 - Oracle

python : "Pandas data cast to numpy dtype of object. Check input data with np.asarray(data)."

mysql - 选择按数组值查询

mysql - 如何从相关子查询中获取 "COUNT"?

sql - 根据不同的符号从一列创建多列