我有两个表:smiles
和 messages
。我想显示两个表中的所有记录,其中:
- (登录用户 = user_id)
- user_id=Toid 或 user_id=Senderid 来自微笑和
- 消息中的 user_id=sender_id 或 user_id=receiver_id
我在这里使用“或”,因为有时user_id
是消息
或微笑
的发送者,有时user_id
code> 是 messages
和 smiles
的接收者,我想显示 user_id
所在的所有记录。
我还想要向其他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
这是消息的表结构
conversation_id|message_id|sender_id|receiver_id|message|message_date|view_status
微笑结构
id|Toid|Senderid|smile_type|send_date|view_status
我尝试使用带有 WHERE 子句的 UNION 获取所有记录,但没有成功。将不胜感激任何帮助。
消息和微笑是两个不同的表
这里有更多说明
“消息+微笑计数”是如何形成的 -> 将 user_007 计为正在检查消息和微笑的登录用户。在他的帐户中,user222 向他发送了 2 条消息,user333 向他发送了 5 条微笑,他本人向 user555 发送了 3 条消息。所以输出将是
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 发送消息,则它将显示在第二行,依此类推。有问题,我还包括表格结构..感谢您的努力
最佳答案
通过分别相加,您可以得到“消息加微笑”的计数:
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 all
与 group 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
关于mysql - 复杂的mysql查询连接两个表并显示所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635001/