【发布时间】: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 的看法是正确的,但我虽然加入可能需要额外的时间而不是自然键。我不是专家^_^
-
用户名只是事情的一部分。也许以后的查询需要用户电子邮件或真实姓名,这无论如何都需要加入。等等等等等等。正确规范化的数据库不会在子表中存储“重复”数据。