复杂的mysql查询,它连接两个表并显示所有记录

时间:2013-07-13 23:10:07

标签: mysql join

我有两个表:smilesmessages。我想显示两个表中的所有记录:

  • (登录的用户= user_id)
  • user_id = Toid或user_id =来自微笑的Senderid和
  • user_id = sender_id或user_id =来自消息的receiver_id

我在这里使用'或',因为有时user_id是[{1}}或messages的发件人,有时smilesuser_id的接收者,{ {1}}我希望显示messages所在的所有记录。

对于向其他smiles发送消息或微笑的每个成员,我还希望总计user_id + messages

我想显示如下数据

smiles

这是消息的表结构

user_id

微笑结构

sender_user_name---Message+Smiles Count---Logged_user-------message 
user_123 --------------6------------------You're Sender-----this is the last message
user_333--------------12------------------You're Receiver---this is the last message  

我尝试使用带有WHERE子句的UNION获取所有记录,但没有成功。将不胜感激任何帮助。

消息和微笑是两个不同的表

这里有一些澄清

如何形成'消息+微笑计数' - >将user_007计为正在检查消息和微笑的登录用户。在他的帐户中,user222向他发送了2条消息,user333向他发送了5条微笑,并且他自己向用户555发送了3条消息。所以out put将是

user222     2    received        Message Details
user333 5 Received smile type
You 3 sent to user555 message details

此处仅显示最后一条消息或笑脸。因此,如果user_123向user_007发送了6条消息和1条微笑,则计数将为7,并且将显示最后一条消息或微笑,如果user_007向另一个user_567发送消息,则它将显示在第二行中,依此类推。是有问题的,我还包括表格结构。感谢您的努力

1 个答案:

答案 0 :(得分:0)

您可以通过单独添加来获得“消息加微笑”计数:

select (s.numsmiles + m.nummessages)
from (select count(*) as numsmiles
      from smiles s
      where $user_id in (s.toid, s.senderid)
     ) s cross join
     (select count(*) as nummessages
      from messages m
      where $user_id in (m.sender_id, m.receiver_id)
     ) m;

关键是你要分别计算每个值,然后将这些值加在一起。

编辑:

如果您希望所有用户使用此功能,那么最好的方法是将union allgroup by一起使用:

select userId, sum(hasSmile) as NumSmiles, sum(hasMessage) as NumMessages,
       sum(hasSmail + hasMessage) as NumSmilesAndMessages
from ((select s.toid as userId, 1 as hasSmile, 0 as hasMessage
       from smiles s
      ) union all
      (select s.senderid, 1 as hasSmile, 0 as hasMessage
       from smiles s
      ) union all
      (select m.sender_id, 0, 1
       from messages m
      ) union all
      (select m.receiver_id, 0, 1
       from messages m
      )
     ) t
group by user_id