【问题标题】:Mysql select from two tables joinMysql select from两个表join
【发布时间】:2019-04-02 22:26:30
【问题描述】:

我有两个表“员工”和“家属”,

    Employees
  |employee_No| Employee_name  |
  |1558       | Bean           |
  |1557       | Juliet         |
  |1556       | Zeke           |

    Dependents
    
  |employee_No| dependent_name | relationship|
  |1558       | Kelvin         | Son         |
  |1558       | Mary           | Daughter    |
  |1556       | Janet          | Spouse      |

有没有办法我可以在一个 MySQL 语句中获取这些数据并使用 php 显示,即循环员工并依赖于该员工然后移动到下一个员工。

当前的php代码是

$employees = select_all_employees()
foreach ($employees as $covered){
  echo $covered['Employee_name'].'<br/>';
$get_dependent = $select_dependent($covered["employee_No "]);
 if($get_dependent != 0){
     foreach($get_dependent as $details){
      echo $details['dependent_name '].' '.$details['relationship'].'<br/>';
     }
  }
}

当有数千名员工和家属时,这需要太多时间来加载

预期结果

|employee_No| dependent_name | relationship|
--------------------------------------------
|1558       | Bean           | principal   |
|1558       | Kelvin         | Son         |
|1558       | Mary           | Daughter    |
|1557       | Juliet         | principal   |
|1556       | Zeke           | principal   |
|1556       | Janet          | Spouse      |

【问题讨论】:

  • 提示:JOIN。您至少还应该向我们展示您希望看到的预期输出。
  • 我添加了预期结果,
  • 主要如何进入你们的关系。并且 Bean 是员工而不是依赖名称。

标签: php mysql sql


【解决方案1】:

获得所需结果的最简单方法是使用UNIONEmployees 表的行与JOINJOIN 及其Dependents。我们将UNION 作为派生表执行此操作,以便我们可以按employee_No 对结果进行排序,并将principal 放在每个employee_No 的首位。通过这种方式,您的 PHP 代码将成为所有结果的简单循环。

SELECT employee_No, Employee_name AS dependent_name, 'principal' AS relationship
FROM Employees
UNION ALL
SELECT e.employee_No, d.dependent_name, d.relationship
FROM Employees e
JOIN Dependents d on d.employee_No = e.employee_No
ORDER BY employee_No DESC, relationship = 'principal' DESC

输出:

employee_No dependent_name  relationship
1558        Bean            principal
1558        Mary            Daughter
1558        Kelvin          Son
1557        Juliet          principal
1556        Zeke            principal
1556        Janet           Spouse

Demo on dbfiddle

【讨论】:

  • 嗨@Nick,你认为这比“左连接”/“isnull”方法更容易吗?
  • @JaimeDrq LEFT JOIN 查询不会为任何有家属的员工返回带有“principal”的行。这就是需要UNION 的原因。见db-fiddle.com/f/eeN6FCvAjVwYePbhyYwPzW/2
  • 感谢@Nick,这非常有效,非常感谢
  • 嗨@Nick,我正在尝试在员工上添加 where 子句,例如JOIN Dependents d on d.employee_No = e.employee_No WHERE e.policy = 9 AND d.policy = 9 但我无法让它工作,请您解释一下我该怎么做?
  • @Fredmax 看到这个demo 它应该回答你的问题。记下查询中关于JOIN 条件的评论
【解决方案2】:

这个查询怎么样:

SELECT a.*, "principal" as 'relationship' FROM Employees a UNION SELECT b.* FROM Dependents b ORDER BY employee_no DESC

DBFIDDLE here

【讨论】:

    【解决方案3】:

    您可以使用连接或映射列。检查两个表中的索引以了解您的查询速度。两个表中的索引应为employee_No。然后循环您的查询输出。

    <?php
        $qryOutput = array();
        $query = "SELECT A.*, B.* FROM Employees A LEFT JOIN Dependents B ON   A.employee_No=B.employee_No" // query
    
        $qryOutput = execute_Query($query); // Check this syntax. For Execute query
    
    
        // Loop through your Query Output
        foreach ($qryOutput as $key => $value) 
        {   echo $value["employee_No"]." ".$value["dependent_name"]." ".$value["relationship"]; }
    
     ?>
    

    【讨论】:

    • 这不会返回预期的输出。校长在哪里?
    • 只返回家属
    • 是的,你是对的。没有家属的员工不会出现在我的查询中。等待我会更新我的答案@JaimeDrq 谢谢。
    • 我已经更新了我的答案,您现在可以查看吗? @Fredmax
    【解决方案4】:

    您可以使用 INNER JOINLEFT JOIN 来实现它。

    试试这样的。虽然我没有测试过代码。

    您的表需要使用外键引用创建才能正常工作。请参阅下面的示例。我已经测试过了。

    create table Employees(employee_No int primary key,Employee_name varchar(100));
    
    create table Dependents(employee_No int primary key,dependent_name varchar(100), relationship varchar(100)
     foreign key (employee_No) references Employees(employee_No));
    

    插入测试

    insert into Employees(employee_No,Employee_name) values(1558,'Bean');
    
    insert into Employees(employee_No,Employee_name) values(1557,'Juliet');
    
    insert into Dependents(employee_No,dependent_name,relationship) values(1558,'kevin','son');
    

    代码

    <?php
    $host = "localhost"; /* Host name */
    $user = "root"; /* User */
    $password = ""; /* Password */
    $dbname = "your-db"; /* Database name */
    
    $con = mysqli_connect($host, $user, $password,$dbname);
    // Check connection
    if (!$con) {
        die("Connection failed: " . mysqli_connect_error());
    }
    
    $query = 'SELECT Employees.employee_No, Employees.Employee_name, Dependents.employee_No, Dependents.dependent_name, 
    Dependents.relationship FROM Employees
    LEFT JOIN Dependents ON Employees.employee_No = Dependents.employee_No
    ORDER BY Employees.Employee_name';
    
        $result = mysqli_query($con,$query);
        while($row = mysqli_fetch_assoc($result)){ 
      $empno = $row['employee_No'];
      $empname = $row['Employee_name'];
      $relation = $row['relationship'];
     $dependant_name = $row['dependent_name'];
    
    //you can now echo
    
    echo $dependant_name.' '.$relation.'<br/>';
    }
    ?>
    

    【讨论】:

    • 您不能使用内连接或左连接。您必须使用左连接,否则您将永远看不到主体
    • 只返回家属
    • 让我试运行一下
    • @Fredmax,我已经更新了我的答案。您将需要使用外键引用创建表。请看我的回答
    • @Jamie,你们在说什么校长。我测试过的内容及其与 INNER JOIN 或 LEFT JOIN 一起使用。你能自己测试代码吗?看到我生你的气,因为你让我失去了 2 分。在发表评论之前始终进行研究。这是下次的情况!!!
    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多