コード
現在、私のコードはそうです。複数の値を同時に2つのテーブルから選択する
$stmt = $this->db->prepare("SELECT m.id, m.from_id, m.to_id, m.subject, m.date, m.deleted, m.read, u.fname, u.mname, u.lname FROM msghistory AS m,users AS u WHERE m.from_id=u.id AND m.to_id=u.id AND GROUP BY m.id DESC");
$stmt->execute();
$stmt->store_result();
if ($stmt->affected_rows > 0) {
$msg = array();
$stmt->bind_result($msg['id'], $msg['from_name'], $msg['to_name'], $msg['subject'], $msg['message'], $msg['date'], $msg['deleted'], $msg['read']);
while ($stmt->fetch()) {
<echoing results one by one> }
}
私は、私が$msg['from_name']
としてu.fname+u.mname+u.lname
(どこmsghistory.from_id=users.id
)を取得したい
何をしたいのか、再びu.fname+u.mname+u.lname
(しかし今回msghistory.to_id=users.id
)の$ MSGの[ 'TO_NAME']など。
例
message | from_id | to-id
hi | 1 | 5
見ての通り、これは意味し、ユーザー1がhiユーザ5メッセージを送信します。
usersテーブルのfnameは、ユーザID = 1のためLNAMEに言うことができます - ジョン・ドウと5のために - ジョージ・スミス が、私はこれを表示したい出力結果として
message | from_id | to-id
hi | John Doe| George Smith
質問
私がいることを知っています少なくとも3つのクエリで可能です。しかし、最適な方法を見つけることを試みる。だから、唯一のクエリで可能ですか?
更新
私はこの
$stmt = $this->db->prepare("SELECT
message.id, message.from_id, message.to_id, message.subject,
message.date, message.deleted, message.read,
CONCAT_WS(' ',sender.fname, sender.mname, sender.lname) AS sender_name,
CONCAT_WS(' ',recipient.fname, recipient.mname, recipient.lname) AS recipient_name,
FROM msghistory AS message
LEFT JOIN users AS sender ON sender.id=message.from_id,
LEFT JOIN users AS recipient ON recipient.id=message.to_id
GROUP BY message.id DESC");
更新された質問をチェックしてください。そうですか? –
いいですね。送信者と受信者がオプションの場合は、(内部結合ではなく)左結合のみが必要です。メッセージに常に送信者と受信者がある場合は、より効率的な内部結合を使用します。私はあなたがgroup by節を使って昇順または降順を指定できるかどうかはわかりませんでした。良い知識! – user1207727