Выбор нескольких значений из двух таблиц одновременно - PullRequest
0 голосов
/ 14 февраля 2012

Код

В настоящее время мой код выглядит так.

            $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>                    }
            }

Что я хочу сделать

Я хочу получить u.fname+u.mname+u.lname (где msghistory.from_id=users.id) как $msg['from_name'], снова u.fname+u.mname+u.lname ( НО на этот раз, где msghistory.to_id=users.id) как $ msg ['to_name'].

Пример

message | from_id | to-id
hi      | 1       | 5

Как видите, это означает, что пользователь 1 отправил пользователю 5 сообщение hi.

Давайте скажем в таблице пользователей fname, lname для идентификатора пользователя = 1 - Джон Доу и для 5 - Джордж Смит Я хочу показать это как результат вывода

message | from_id | to-id
hi      | John Doe| George Smith

Вопрос

Я знаю, что это возможно по крайней мере с 3 запросами. Но пытаюсь найти оптимальный путь. Итак, это возможно с одним и единственным запросом?

Обновление

На основании 2 полезных ответов пользователей, я изменил запрос в этом

            $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");

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Использование явных объединений и понятных, читаемых псевдонимов делает запрос более надежным и удобным для чтения.Попробуйте следующее:

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

Вы можете заменить select * s только полями, которые вы хотите для эффективности

1 голос
/ 14 февраля 2012
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

Я не уверен, что вам нужна "группа по"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...