有没有一种方法可以在MySQL中获得一个结果集,该结果集包含在一个查询中连接到同一个表的两列


Is there a way to get a resultset involving 2 columns joined to the same table in one query in MySQL?

我有一个简单的消息传递系统,我想同时显示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;
    }
}

因此,我要做的是选择toidfromid等于用户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规范了解更多信息。