2012-02-13 43 views
0

代码

目前我的代码看起来像那样。一次从两个表中选择多个值

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

回答

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

查看更新的问题。是对的吗? – 2012-02-13 23:39:45

+0

它看起来不错。如果发送者和接收者是可选的,你只需要左连接(而不是内连接)。如果一个消息总是有一个发送者和接收者,那么使用内部连接,因为他们更有效率。我不知道你可以用group by子句指定一个asc或desc方向。非常精通! – user1207727 2012-02-14 06:53:21

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 

我不知道你“按组”

+0

集团通过,下降排序替换选择* S。顺便说一句,我可以选择u1.fname,u1.mname,u1.lname作为1个变量name1(换句话说就是将它们与查询中的空间拼成一个变量名称1)? – 2012-02-13 22:51:22

+0

CONCAT(u1.fname,“”,u1.lname)AS“名” – alfasin 2012-02-13 23:08:21

+0

我觉得如果有些值是空CONCAT将无法正常工作。所以concat_ws适合这个目的,对吧? – 2012-02-13 23:14:48