【问题标题】:Complex mysql query which join two tables and display all records连接两个表并显示所有记录的复杂 mysql 查询
【发布时间】:2013-07-13 23:10:07
【问题描述】:

我有两张桌子:smilesmessages。我想显示两个表中的所有记录,其中:

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

我在这里使用“或”,因为有时user_idmessagessmiles 的发送者,有时user_idmessagessmiles 的接收者,我想显示所有记录user_id 在其中。

我还想要向其他user_id 发送消息或微笑的每个成员的messages+smiles 总数。

我想显示如下数据

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 收到消息详情
user333 5 收到的微笑类型
你 3 发送给 user555 的消息详情

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

【问题讨论】:

  • 我想我已经让这个问题更容易理解了——我或多或少地看到了你的要求——但你可能应该提供一些示例数据和相应的输出。具体来说,我不清楚“消息+微笑计数”是如何形成的。假设“登录用户ID”是user_007,那么与user_123 相关联的计数是6,那么user_123 发送给user_007 的消息和微笑的数量是多少?微笑与信息无关吗? “这是最后一条信息”重要吗?这是否意味着您想要从user_123user_007 的最新消息?
  • 一种可能的选择是“消息+微笑计数”包括由user_007 发送到user_123 的消息,反之亦然。并且可能是要显示的最后一条消息是由user_007 发送到user_123 而不是反之亦然。但是你的问题(还没有)清楚地说明所有这些细节。请对其进行编辑以包含必要的信息以及足够的数据以生成示例输出(您可能希望将数字 6 和 12 减少为更易于管理的数字,例如 3 和 4)。
  • 谢谢乔纳森,我已经添加了更多有关问题的说明。

标签: mysql join


【解决方案1】:

您可以通过将它们分别相加来获得“消息加微笑”计数:

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

【讨论】:

  • 感谢您的解决方案。它为我提供了登录用户(此处为 $user_id)接收或发送的微笑+消息的总数,但它并没有给出用户的微笑+消息。例如,如果 user123 发送 4 条消息,如果用户 333 向 user666 发送 9 个微笑,如果 user666 向 user546 发送 2 条消息,则我希望输出为 Received user123 4 和 Received user 333 9 和 Sent user564 2 ....我需要添加分组依据?
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2013-03-27
  • 2016-12-05
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多