【问题标题】:How to get the value from the primary key AND foreign key when joining mySQL tables?加入mySQL表时如何从主键和外键中获取值?
【发布时间】:2012-11-19 04:32:51
【问题描述】:

我有两个表,employee 作为父表,license 作为子表。它们都有一个Lic_ID 列供参考,该列是license 中的PKemployee 中的FKlicense 表还有一个列 Lic_Type 包含许可证的名称。

我正在尝试创建一个带有列表框的表格,以便可以更新 employee 表格。列表框value 需要填充license.Lic_IDlicense.Lic_Type 将显示在option 中。这是我所拥有的:

(Employee name, Id, etc. called out up here)

<?php
echo "<select name=\"Lic\">";
echo "<option value=\"\">Select...</option>";

$sql = $mysqli->query("SELECT Lic_ID, Lic_Type FROM license");

while($row = $result->fetch_assoc())
     {
     echo "<option value=\"" . $row['Lic_ID'] . "\">" . $row['Lic_Type'] . "</option>";
     }

echo "</select>";
?>

这样效果很好,它显示了许可证类型并将值设置为许可证 ID。如果为员工设置了许可证 ID,我想要做的是拥有 &lt;option selected="selected"&gt;。这段代码不起作用,但我认为它说明了我正在尝试做的事情:

<?php
echo "<select name=\"Lic\">";
echo "<option value=\"\">Select...</option>";

$sql = $mysqli->query("SELECT license.Lic_ID, license.Lic_Type, employee.Lic_ID FROM employee INNER JOIN license ON employee.Lic_ID = license.Lic_ID");

while($row = $result->fetch_assoc())
     {
     echo "<option value=\"" . $row['license.Lic_ID'] . "\"";
         if($row['employee.Lic_ID'] = $row['license.Lic_ID']){echo "selected=\"selected\";}
     echo ">" . $row['license.Lic_Type'] . "</option>";
     }

echo "</select>";
?>

有没有办法完成我想做的事情?

【问题讨论】:

  • 这看起来像您正在获取所有员工以及每个员工加入的许可证类型。您是否要为单个员工执行此操作?
  • 您应该使用两个查询,一个用于获取可能的许可证选项(您在原始代码中拥有),然后一个用于选择或迭代员工。您试图以一种没有意义的方式组合特定记录和所有可能的选项。
  • @DavidHarkness 我正在尝试为所有员工获取它,而不是单个员工。
  • @MattWhipple 我同意这没有意义。我意识到这段代码是错误的方法,我真的只是想说明我想要完成的事情。如果我使用两个单独的查询,我将如何通过同一个循环运行它们?另外,为什么投反对票?

标签: php mysql inner-join


【解决方案1】:

我认为我究竟想要完成什么可能有些混乱,我很抱歉不是很清楚。无论如何,我今天偶然发现了答案,所以我想我应该发布它。

$sql1 = ("SELECT Emp_Name, Lic_MAT_ID FROM employee");

if(!$result_employee_query = $mysqli->query($sql1))
    {
    die ("There was an error getting the records from the employee table");
    }

while($employee = $result_employee_query->fetch_assoc())
    {
    echo "Employee Name: " . $employee['Emp_Name'] . "<br>";

    echo "License: ";
    echo "<select>";

    $sql2 = ("SELECT Lic_MAT_ID, Lic_MAT_Type FROM license_mat");

    if(!$result_license_query = $mysqli->query($sql2))
        {
        die ("There was an error getting the records from the license table");
        }

    while($license = $result_license_query->fetch_assoc())
        {
        echo "<option value=\"" . $license ['Lic_MAT_ID'] . "\"";
            if($license['Lic_MAT_ID'] == $employee['Lic_MAT_ID'])
                {
                echo " selected=\"selected\"";
                }
        echo ">" . $license ['Lic_MAT_Type'] . "</option>";
        }

    echo "</select><br>";
    }

【讨论】:

    【解决方案2】:

    据我了解您的问题:您想查看许可证是否已添加到任何用户或已取消分配。如果任何用户都设置了许可证,则它被“选中”,否则不会。

    首先,您必须将关键字 "multiple" 分配给您的 select 对象以使其成为列表框:

    echo "<select name=\"Lic\" multiple=\"multiple\">";
    

    第二:我会写这样的查询:

    $sql = $mysqli->query("SELECT l.Lic_ID, l.Lic_Type, e.cnt FROM licence l left outer join (select Lic_id, count(*) cnt from employee group by Lic_id) e on l.Lic_ID=e.Lic_id");
    

    它选择Lic_IDLic_Typecount 有多少员工设置了相应的 Lic_ID (left outer join)

    在代码中检查,如果count 高于 0

    if($row['cnt'] > 0){ 
      echo "selected=\"selected\";
    }
    

    【讨论】:

    • 非常感谢您的回复,但很抱歉,这不是我想要的。我认为不可能做我想做的事。我希望能够将许可证表中的记录显示为选项,但要根据员工表中的内容进行选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多