内部加入子查询和或

时间:2014-01-18 16:03:38

标签: mysql sql

我正在与几个对话建立聊天,并且有一项任务是从每个对话中提取最新消息。 通过对话我的意思是来自特定用户的消息。 (它由fromidtoid列定义。

我的计划:

1)提取对话的ID

2)自己提取消息

基于此处类似问题的答案,我构建了无法执行的查询(“您的SQL语法出错;请查看与您的MySQL服务器版本对应的手册,以便在'WHERE {附近使用正确的语法{1}}!= 4 LIMIT 10)table2 ON(table2.VALIDID =`support_chat_message'在第1行“)

我的查询是

fromid

一些解释:

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` 并通过相同的字段对它们进行分组以获得对话(=用户ID)。用户标识名为VALIDID

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

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

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

查询有什么问题?

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

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

感谢您的帮助。

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

期望的结果会是这样......

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

1 个答案:

答案 0 :(得分: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