2012-01-13 5 views
1

私はシンプルなメッセージングシステムを持っています。私はReceivedメッセージとSentメッセージの両方を表示したいと思います。次のように無関係な情報を省略して、関連するテーブル/カラムは、レイアウトされている:MySQLの1つのクエリで2つのカラムが同じテーブルに結合された結果セットを取得する方法はありますか?

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[]の配列に重複が含まれている点を除いて、ほとんどの種類のクエリが動作します。つまり、各行が2回リストされ、ユーザーの名前が表示され、もう一方が受信者の名前を表示します。私はなぜそんなに見ることができますが、私はそれを修正するために何をすべきか分かりません。

私は自分のSQLクエリやPHPスクリプトを調整する必要があるかどうかわかりませんので、両方を含めました。

私は2つのクエリに分けることができますが、私は自分のSQLを改善し、ジョインがどのように機能するかについてもっと学びたいと思っています。

答えて

3

二つが結合しない - つまり、ユーザテーブル「から」用と「へ」のための別の時間に参加し、このような何か:

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"; 
+0

をこれは完璧に動作します!私は2つの結合を使用するとは思わなかった。 – Corey

0

UNIONを試しましたか?詳細はMySQLの仕様を見てください。

関連する問題