2010-04-14 53 views
0

我有3个表需要加入。合同表是主表,“工作”和“公司”表是可以与合同表关联的额外信息。多个左连接,如何在php中输出

这样,因为我想从我的“合同”表中的所有条目,而“工作”和“公司”的数据,只有当它存在,我写这样的查询....

$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"; 
} 

任何帮助表示赞赏。

+0

您可能想使用“别名”来使得数据获取过程变得简单... – Hanseh 2010-04-14 06:51:47

回答

1

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

+0

就像一个魅力。谢谢! – uberdanzik 2010-04-14 07:59:48

0

以下将解决您的问题。

$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"; 

你的问题很可能是realted您正在使用两个表与现场id的事实,这就是为什么你应该选择它们作为使用mysql as子句的别名。

您可能还想研究一下为您的字段使用命名约定并坚持使用它。例如,查看Hungarian Notation的理论,这可以避免类似这样的问题发生。

+0

不能完全解决与使用前缀名称检索列有关的问题。 – 2010-04-14 08:04:07