2011-04-21 93 views
0

我想要将来自PHP查询的返回结果与来自另一个表的字段进行排序,该字段在返回第一个表时收集。解释...PHP SQL排序依据来自不同表中的字段

$args1 = array('order' => 'ASC'); 
    $list = get_users($args1); 

     foreach ($list as $post) { 
      $email = $post->user_email 

; 
     $id = $post->ID; 

     $user = get_userdata($id); 
     $firstname = $user->user_firstname; 

解释... get_users从用户数据库中获取所有用户。问题是usersdata是另一个包含用户姓氏的表。我们需要第一个查询中的ID来获取正确的姓氏。这就是我们想通过这个姓氏排序整个数据的姓氏。

Userdata表使用meta_keys以及每个键旁边对应用户的ID。

所以我后面是用usermeta键“姓氏”排序用户数据。这是完整的代码。

$args1 = array('order' => 'ASC'); 
$list = get_users($args1); 

foreach ($list as $post) { 
    $email = $post->user_email; 
    $id = $post->ID; 

    $user = get_userdata($id); 
    $firstname = $user->user_firstname; 
    $lastname = $user->user_lastname; 
    $return .= '<li> 
       <a href="#sidebar2" onClick="slide(this); return false" rel="clients_list_page" style="line-height:16px;">'.$firstname.' '.$lastname.'<br /><span style="font-size:10px; color:#555;">'.$email.'</span></a> 
      </li>'; 

} 
    $return .= '</div>'; 

任何想法?

非凡

回答

2

它看起来过于复杂,你这样做。您不能只使用JOIN从一个查询中的两个表中获取数据吗?

在普通的SQL,这将是这样的:

SELECT users.email, userdata.firstname, userdata.lastname 
    FROM users LEFT JOIN userdata 
     ON users.id=userdata.user_id 
    ORDER BY userdata.lastname 
+0

这是非常好的,但它不会完成任务,因为我们在名为firstname或lastname的表中没有行。该行称为META KEY,在该行中是firstname,lastname和address的字段,其中包含与原始用户相对应的ID。 – 2011-04-23 11:53:28

0

如果我理解正确的问题,那么这不是一个PHP的问题。

你可以通过一个简单的连接来解决这个问题,并在数据库方面命令所有的东西。即使你使用的是某种ORM,你也可以运行一个查询,它只能从一个表格返回字段,并且顺序正确。

0

@ jeroen是正确的使用一种JOIN。有两种类型的JOIN,一个LEFT JOININNER JOIN。两者之间的区别在于LEFT JOIN,如果左边的表格(在这种情况下为users表格)包含右表中没有相应记录的记录(例如,您的users表格中记录的id为与您的userdata表中的记录不匹配),它将从左表中返回这些行,NULL值表示应该来自右表的值。使用INNER JOIN这些行将不会被返回。

一个INNER JOIN语法将是这个样子:

SELECT users.email, userdata.firstname, userdata.lastname 
    FROM (users, userdata) 
     WHERE (users.id = userdata.user_id) 
    ORDER BY userdata.lastname ASC 

如果你想任何附加条件添加到查询,您只需将它们放在WHERE子句。

+0

实际上你是走了 - 有几种方法可以加入,而不仅仅是内心和左边。您可以交叉连接,straight_join,straight_join打开,左和右,左外部/右外部连接和自然连接。在15年的编程中,即使是我遇到的最好的全职DBA,也没有精通这些选项,我认为作为一个社区,我们应该努力提高效率。这些用于/每个解决方案正在成为常见的方式,即使是它的内容。 – bpeterson76 2011-04-21 19:13:17

+0

@ bpeterson76感谢您的启发,我不知道有这么多不同的JOIN。回到我想的书上来... – Kyle 2011-04-25 20:21:54