我有一个简单的消息传递系统,我想同时显示Received和Sent消息。相关表格/列布局如下,省略了无关信息:
User:
id | firstName | lastName
-------------------------
Message:
id | fromid | toid | message
----------------------------
我正在运行的查询是:
SELECT message.id, `fromid`, `toid`, `sent`, `message`, message.email, `read`, user.id, `firstName`, `lastName`, `rank`
FROM message LEFT JOIN `user` ON message.fromid = user.id OR message.toid = user.id
WHERE `toid` = '$id' OR `fromid` = '$id'
ORDER BY `read` DESC, `sent` DESC";
(为了在我的PHP脚本中进行排序,我会:)
$received = array();
$sent = array();
while ($dbRow = mysql_fetch_array($query)) {
if ($dbRow['toid'] == $id) {
$received[] = $dbRow;
} else if ($dbRow['fromid'] == $id) {
$sent[] = $dbRow;
}
}
因此,我要做的是选择toid
或fromid
等于用户id的消息,然后对其进行相应排序(即,如果用户id在toid
列,则它是从其他用户发送给他们的,而如果它在fromid
列,则用户已将它发送给其他人)。
除了$sent[]
数组包含重复项之外,该查询几乎可以正常工作:它将每行列出两次,一次显示用户名,另一次显示接收方名称。我知道为什么,但我不知道该怎么做才能修复它。
我不知道是需要调整SQL查询还是PHP脚本,所以我已经包含了这两个内容。
我知道我可以把它分成两个查询,但我正在努力改进我的SQL,并了解更多关于JOIN如何工作的信息。
进行两次连接-换句话说,连接用户表,一次连接"from",另一次连接到"to",类似这样:
SELECT message.id, `fromid`, `toid`, `sent`, `message`, message.email, `read`, fromuser.*, touser.*
FROM message LEFT JOIN `user` fromuser ON message.fromid = user.id
LEFT JOIN `user` touser ON message.toid = user.id
WHERE `toid` = '$id' OR `fromid` = '$id'
ORDER BY `read` DESC, `sent` DESC";
您尝试过UNION
吗?查看MySQL规范了解更多信息。