代码
目前我的代码看起来像那样。一次从两个表中选择多个值
$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
)为$味精[ 'TO_NAME上'。
message | from_id | to-id
hi | 1 | 5
正如所看到的,这意味着,用户1发送到用户5的消息喜。
允许在用户表FNAME说,L-NAME的用户ID = 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");
查看更新的问题。是对的吗? – 2012-02-13 23:39:45
它看起来不错。如果发送者和接收者是可选的,你只需要左连接(而不是内连接)。如果一个消息总是有一个发送者和接收者,那么使用内部连接,因为他们更有效率。我不知道你可以用group by子句指定一个asc或desc方向。非常精通! – user1207727 2012-02-14 06:53:21