2012-02-13 13 views
0

コード

現在、私のコードはそうです。複数の値を同時に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"); 

答えて

1

「でグループ」必要わからないんだけど明確で読みやすいエイリアスにより、より堅牢なクエリと読みやすくなります。以下試してください:

SELECT message.*, recipient.*, sender.* 
FROM msghistory AS message 
INNER JOIN users AS recipient ON recipient.id=m.to_id 
INNER JOIN users AS sender ON sender.id=m.from_id 

あなたは、ソートの子孫のためにすることによって効率

+0

更新された質問をチェックしてください。そうですか? –

+0

いいですね。送信者と受信者がオプションの場合は、(内部結合ではなく)左結合のみが必要です。メッセージに常に送信者と受信者がある場合は、より効率的な内部結合を使用します。私はあなたがgroup by節を使って昇順または降順を指定できるかどうかはわかりませんでした。良い知識! – user1207727

1
SELECT m.id, m.from_id, m.to_id, m.subject, m.date, 
m.deleted, m.read, u1.fname, u1.mname, u1.lname, 
u2.fname, u2.mname, u2.lname,  
FROM msghistory AS m,users AS u1, users As u2  
WHERE m.from_id=u1.id AND m.to_id=u2.id 
GROUP BY m.id DESC 

にクエリを変更し、ユーザーによって2件の有用な回答に基づいて、私はあなたが参加し、明示的に使用

+0

グループのためにあなたがしたいだけのフィールドで選択* Sを置き換えることができます。 btw私はu1.fname、u1.mname、u1.lnameを1変数name1として選択することができます(言い換えれば、1つの変数name1にクエリ内にスペースを入れて)? –

+0

CONCAT(u1.fname、 ""、u1.lname)AS 'name' – alfasin

+0

これらの値の一部がnullの場合、concatは機能しません。 concat_wsはこの目的には適していますよね? –

関連する問題