Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接两个表并显示所有记录的复杂mysql查询_Mysql_Join - Fatal编程技术网

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

连接两个表并显示所有记录的复杂mysql查询,mysql,join,Mysql,Join,我有两张表:smiles和messages。我想显示两个表中的所有记录,其中: (loggedin=user\u id的用户) 用户\u id=Toid或用户\u id=smiles和 用户id=发件人id或用户id=收件人id(来自邮件) 我在这里使用“或”,因为有时user\u id是消息的发送者,有时user\u id是消息的接收者,有时user\u id是消息和微笑的接收者,我想显示user\u id所在的所有记录 我还需要每个向其他用户id发送消息或微笑的成员的消息总数 我想显示如

我有两张表:
smiles
messages
。我想显示两个表中的所有记录,其中:

  • (loggedin=user\u id的用户)
  • 用户\u id=Toid或用户\u id=smiles和
  • 用户id=发件人id或用户id=收件人id(来自邮件)
我在这里使用“或”,因为有时
user\u id
消息的发送者,有时
user\u id
消息的接收者,有时
user\u id
消息和
微笑的接收者,我想显示
user\u id
所在的所有记录

我还需要每个向其他
用户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
我试图用UNION with WHERE子句获取所有记录,但没有成功。谢谢你的帮助

信息和微笑是两张不同的桌子

这里有更多的澄清

“消息+微笑计数”的形成方式->将用户计数为正在检查消息和微笑的登录用户。在他的账户中,user222向他发送了2条消息,user333向他发送了5个微笑,他自己向user555发送了3条消息。因此,我们将被淘汰

user222 2 received Message Details
user333 5 Received smile type
You 3 sent to user555 message details user222 2收到的消息详细信息
user333 5收到的微笑类型
您3已向user555发送消息详细信息 此处仅显示最后一条消息或微笑。因此,如果用户_123向用户_007发送了6条消息和1个微笑,则计数将为7,并且显示最后一条消息或微笑,如果用户_007向另一个用户_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
groupby

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

我想我已经让这个问题更容易理解了——我或多或少能看出你在问什么——但是你可能应该提供一些样本数据和相应的输出。具体来说,我不清楚“信息+微笑计数”是如何形成的。假设“登录用户ID”是
user\u 007
,那么是与
user\u 123
相关联的6个计数,
user\u 123
发送给
user\u 007
的消息和微笑的数量?微笑是否独立于信息?“这是最后一条信息”是否重要?这是否意味着您希望从
user_123
发送到
user_007
?一种可能的替代方法是“消息+微笑计数”包括
user_007
发送到
user_123
的消息,以及反之亦然。可能最后显示的消息是由
user_007
发送给
user_123
的,而不是相反。但你的问题(还)没有把所有这些细节都说清楚。请对其进行编辑,以包含必要的信息和足够的数据,以生成样本输出(您可能希望将数字6和12减少为更易于管理的数字,如3和4)。谢谢Jonathan,我在问题中添加了更多说明。谢谢您的解决方案。它提供登录用户接收或发送的微笑+消息总数(此处为$user_id),但不提供用户的任何微笑+消息。例如,如果用户123发送4条消息,如果用户333向用户666发送9个微笑,如果用户666向用户546发送2条消息,则我希望以接收用户123 4、接收用户333 9和发送用户564 2的形式输出…我需要添加分组依据吗?