连接第二个表

时间:2015-06-09 21:10:00

标签: php mysql database

我有点怀疑。

是否可以使用mysql完成此操作,或者在从用户表获取结果后我必须执行另一个查询。

我有表用户

ID名称

我有表 phonenumbers

phonenumberid用户ID和手机

用户可以多个电话号码,这些电话号码将存储在使用外键用户ID 的phonenumbers表中。

实施例。 如果用户将在编辑个人信息页面并且应该显示他已插入的所有电话号码以删除它们进行编辑等...

那么如何在一个查询中获取所有的phonenumers(WHERE users.id = 1);

或者我应该在users表中选择第一个基本信息,然后创建另一个单独的查询来获取并存储在数组userphonenumbers中或者推入用户表结果数组。

我希望我们能得到很好的例子。

编辑:

以下是示例查询

SELECT users.id, phonenumbers.userid, phone, name 
FROM users 
LEFT JOIN phonenumbers ON phonenumbers.userid = users.id 
WHERE users.id = 1;

我在phonenumbers表中有2个phonenumbers with foreignkey(userid)= 1但是当我进行查询时,我得到了具有相同名称的重复行,当我执行foreach循环时,我将得到重复项。

我希望将它们分组为userid = 1有手机545454和324398493

结果示例

id     name   phone     userid
1      John   4112258     1
1      John   5698745     1

如果用户有10部电话,则会添加10个额外的行,并且在循环中将重复所有的行,但不必要,将像多个用户一样行动

3 个答案:

答案 0 :(得分:1)

使用基于关系代数的方法,您无法通过连接用户ID来执行两个表的笛卡尔积的选择,您可以为每个客户提供一个答案,其中一行包含多个可能的电话号码变量。

如果你想获得这样的结果,最简单的方法是使用一个只对用户执行查询的过程,然后递归地为每个用户执行一个关于此结果的电话号码的子查询,可以干预以将结果格式化为你想要

答案 1 :(得分:1)

你可能觉得这很有用吗?

<强> connection.php

function db(){
  return new mysqli('host', 'username', 'password', 'database');
}

<强> page.php文件

include_once 'connection.php'; $db = db(); $a = array();
if($uq = $db->query('SELECT id,name FROM users')){
  if($uq->num_rows > 0){
    while($u = $uq->fetch_object()){
      $u->phones = array();
      if($q = $db->query("SELECT phonenumberid,phone FROM phonenumbers WHERE userid={$u->id}")){
        if($q->num_rows > 0){
          while($o = $q->fetch_object()){
            $u->phones[] = $o;
          }
        }
        $q->free();
      }
      $a[] = $u;
    }
  }
  $uq->free();
}
print_r($a);
$db->close();

答案 2 :(得分:0)

我无法看到您的SQL结果出错的地方。它正在做它应该做的事情。听起来你希望它看起来像一个人类可读的报告。如果是这样的话,你必须做的不仅仅是SQL。这是你的意思吗?

从我最初在SO上的某个地方进行了修改($obj已传递到我的视图):

<?PHP   if (!empty($obj)): 
          $previous_heading = false;
?>

          some_markup like <table>

    <?PHP foreach ($obj as $key => $value): ?>

    <tr>                

    <?PHP if (!$previous_heading || $value['user.id'] != $previous_heading): ?>

               Do markup stuff with the heading like display the name of the user

            <td>
             <?PHP $value['my_column'];
            </td>

    <?PHP end if; ?>
                    ..more markup...
         <td>
             <?PHP $value['phone_number'];
         </td>
        </tr>

    <?PHP 
              //do other stuff that is not related to your heading, "John," like display   phone numbers.
           $previous_heading = $value['user.id'];
           end foreach;
         ?>
        </table>
        ...ending markup tags....