【问题标题】:Multiple left joins, how to output in php多个左连接,如何在php中输出
【发布时间】:2011-02-07 18:53:25
【问题描述】:

我需要加入 3 张桌子。合同表是主表,“工作”和“公司”表是可以关联到合同表的额外信息。

所以,因为我想要我的“合同”表中的所有条目,以及“工作”和“公司”数据(如果存在),我这样编写查询......

$sql = "SELECT * FROM contracts
        LEFT JOIN jobs ON contracts.job_id = jobs.id
        LEFT JOIN companies ON contracts.company_id = companies.id
        ORDER BY contracts.end_date";

现在我将如何在 PHP 中输​​出它?我试过了,但一直收到未定义的错误“通知:未定义的索引:contracts.id”...

$sql_result = mysql_query($sql,$connection) or die ("Fail.");

if(mysql_num_rows($sql_result) > 0){

    while($row = mysql_fetch_array($sql_result))
    {
       $contract_id = stripslashes($row['contracts.id']);
       $job_number = stripslashes($row['jobs.job_number']);
       $company_name = stripslashes($row['companies.name']);
    ?>
        <tr id="<?=$contract_id?>">
           <td><?=$job_number?></td>
           <td><?=$company_name?></td>
        </tr>
    <?  
    }
}else{
    echo "No records found";
}

感谢任何帮助。

【问题讨论】:

  • 您可能希望使用“别名”来简化获取数据的过程...

标签: php mysql double outer-join


【解决方案1】:

列名不会像这样加上前缀 - 每个表都有一个名为“id”的列,您可能会遇到麻烦。您应该明确标识要返回的列,而不是使用“select *”,然后您只需按名称不加前缀(例如$row['job_number'])检索列。

【讨论】:

    【解决方案2】:

    下面会解决你的问题。

    $sql = "SELECT contracts.id AS contract_id, jobs.job_number, companies.name FROM contracts
            LEFT JOIN jobs ON contracts.job_id = jobs.id
            LEFT JOIN companies ON contracts.company_id = companies.id
            ORDER BY contracts.end_date";
    

    您的问题很可能是因为您使用了两个带有字段id 的表,这就是为什么您应该使用mysql as 子句选择它们作为别名。

    您可能还想考虑为您的字段使用命名约定并坚持下去。比如看看Hungarian Notation的理论,这样就不会出现这样的问题了。

    【讨论】:

    • 并不能完全解决问题,这与使用前缀名称检索列有关。
    猜你喜欢
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多