【问题标题】:How to retrieve a chat msg with sender and receiver username in mysql如何在mysql中检索带有发送者和接收者用户名的聊天消息
【发布时间】:2015-04-09 18:49:35
【问题描述】:
chat Table
-------------------------------------------------------
msg_id  msg(description of msg)   sender(id)   receiver(id)
-------------------------------------------------------
1       hello                      2             1
1       how are you                1             2
----------------------------------------------------------

user table
-----------------------
u_id   username
-----------------------
1       usman
2       Ali
---------------------

这里有两张桌子,一张用于聊天,一张用于用户 我在这两个表之间建立了关系,但我觉得如何从这些表中提取数据有困难。

我想要什么..

我想提取每个发送者的消息及其用户名和每个接收者的名称及其用户名,例如 facebook 聊天,所以我进行此查询

我把这个查询放到数据库中

select u.user_name UserName,msg.msg
from user u,messages msg 
where (msg.sender or msg.receiver)=(select u_id from user where u_id= 1 )
    and msg.sender=1
order by msg.msg_id desc

但是这个查询用接收名称重复发送方消息,用发送方名称重复接收方消息

我想用他们的名字分别显示发送者和接收者的消息显示告诉我任何方法我如何解决它。

【问题讨论】:

  • 你反对使用JOIN吗?我假设当 Ali 去检查聊天时,您只想查看发送给他的消息。 SELECT u.username AS UserName, c.msg FROM chat AS c JOIN user AS u ON c.sender = u.u_id WHERE c.receiver = 2 ORDER BY c.msg_id DESC;
  • 马克的回答很中肯。但是您可以节省 2 次连接和额外的头痛。如果用户名是唯一的,则将用户名直接放在发送者和接收者列中。
  • @Bsienn:也许,但存储/比较整数 ID 更便宜。消息表可以很快变大,即使每次查询节省几微秒,从长远来看也可以节省大量资金。
  • @MarcB 您对 INT id 的看法是正确的,但我虽然加入可能需要额外的时间而不是自然键。我不是专家^_^
  • 用户名只是事情的一部分。也许以后的查询需要用户电子邮件或真实姓名,这无论如何都需要加入。等等等等等等。正确规范化的数据库不会在子表中存储“重复”数据。

标签: php mysql


【解决方案1】:

你所拥有的永远不会奏效。 or 比较将返回一个布尔真/假值,然后您将其与 u_id 的值进行比较。由于 u_id 查询被硬编码为仅返回 1,因此您实际上是在执行 where true/false = 1

您需要加入user 表两次(接收方一次,发送方一次):

SELECT sender.user_name, receiver.user_name, msg.msg
FROM msg
LEFT JOIN user AS sender ON msg.sender_id = sender.u_id
LEFT JOIN user AS receiver ON msg.receiver_id = receiver.u_id
ORDER BY msg.msg_id

【讨论】:

    【解决方案2】:
      select users.name, messages.msg ....          Etc from messages inner join users on       msgs.userid = user.id where                             (sender = :sndr and receiver = :rcvr)         or (sender = :rcvr and receiver= :sndr)  order by date desc;        
                    take note of the named parameters there.  That would return the conversation between the two users 
    

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2021-06-30
      • 2013-08-13
      • 2014-01-12
      • 1970-01-01
      • 2015-07-28
      相关资源
      最近更新 更多