【问题标题】:Inner Join with subquery and or带有子查询和或的内连接
【发布时间】:2014-02-07 23:55:59
【问题描述】:

我正在建立一个包含多个对话的聊天,并且我的任务是从每个对话中提取最新消息。 对话是指来自或发往特定用户的消息。 (由fromidtoid 列定义)。

我的计划:

1) 提取对话ID

2) 自己提取消息

根据此处对类似问题的回答,我构建了无法执行的查询(“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在 'WHERE @ 附近使用的正确语法987654324@ != 4 LIMIT 10) table2 ON (table2.VALIDID = `support_chat_message' at line 1")

我的查询是

SELECT `fromid`, `toid`, `message`, `sendat`, `messageid` 
FROM `support_chat_messages` INNER JOIN
             (SELECT  `fromid` as VALIDID 
             FROM  `support_chat_messages`  
             GROUP BY  `fromid`
             WHERE `fromid` != 4 LIMIT 10) table2 
        ON  (table2.VALIDID = `support_chat_messages`.`fromid`) 
        OR (table2.VALIDID = `support_chat_messages`.`toid`) ORDER BY `messageid`

一些解释:

1) 我选择fromid 并通过同一字段对它们进行分组以获取对话(=用户 ID)。用户 id 被命名为 VALIDID

2) 其中fromid!= 4 表示不是来自我的消息(只有其他用户 ID)。

3) 限制 10 - 不超过 10 个对话。

4) 我在表 support_chat_messages 中搜索从选定用户 (table2.VALIDID = support_chat_messages.fromid) 或选定用户 (table2.VALIDID = support_chat_messages.toid) 发送的消息

查询有什么问题?

如何限制查询?我需要从每个对话中获取最新消息。如果我把限制 1 放在最后,我只会得到最新的对话,而不是每个对话 1。

你知道如何优化它吗?我将每 2 秒刷新一次,这样的查询将严重加载系统。我有一个想法在没有加入的情况下使用 groupby(fromid 或 toid),但不确定这样的表达式是否有效。

感谢您的帮助。

这是一个相同的小提琴。 sqlfiddle.com/#!2/796c4/4/0

想要的结果是这样的......

对话是(7和4),(6和4),(5和4),(2和4)对于每个顶部消息是(22),(21),(20),(18)

【问题讨论】:

  • 需求结果:(fromid, toid, messageid): (7,4,22),(6,4,21),(5,4,20),(2,4,18)
  • 对话有 (7 和 4), (6 和 4), (5 和 4), (2 和 4) 对于每个顶部消息是 (22), (21), (20), (18)

标签: mysql sql


【解决方案1】:
SELECT x.* 
  FROM support_chat_messages x
  JOIN 
     ( SELECT fromid
            , MAX(sendat) max_sendat 
         FROM support_chat_messages 
        WHERE fromid != 4
        GROUP
           BY fromid
     ) y
    ON y.fromid = x.fromid 
   AND y.max_sendat = x.sendat;

http://sqlfiddle.com/#!2/796c4/6

【讨论】:

  • 谢谢!是否有可能以某种方式对其进行优化?
  • (fromid,sendat) 上的索引
  • fromid和toid取反时如何考虑?
  • 更新你的小提琴和想要的结果集
猜你喜欢
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2018-06-04
相关资源
最近更新 更多