2012-12-10 67 views
1

可能重复:
How to LEFT JOIN two tables with the same column nameMySQL的左连接

我有这样的说法:

$sql = "SELECT * FROM deliveries AS del 
     LEFT JOIN job_sheet ON job_sheet.job_id=del.jID 
     LEFT JOIN hierarchy AS h ON job_sheet.h_str=h.hID 
     LEFT JOIN customers ON h.cust=customers.ID"; 

我的问题是, '客户' 表中有一个名为ID列'送货'表也是如此。当我运行一个while循环来输出结果时,问题就开始了。

while($data = mysql_fetch_array($sql)) 
{ 
    echo $data['ID']; 
} 

它输出加入的最后一张表的值...我怎样才能将两者分开?我的意思是,我需要能够从两个表中输出“ID”,但在查询中,这是最后一个获胜的表。重命名列不是一个选项...

任何输入?

+6

决不'SELECT *'在连接查询。始终明确指出SELECT列表中的列,并指定别名:'SELECT h.ID as h_id,del.ID as del_id' –

回答

0

我想通了与一些调整:

SELECT 
     deliveries.*, 
     job_sheet.*, 
     customers.ID as CUSTOMERID 
     FROM deliveries 
      LEFT JOIN job_sheet ON job_sheet.job_id=deliveries.jID 
      LEFT JOIN hierarchy ON job_sheet.h_str=hierarchy.hID 
      LEFT JOIN customers ON hierarchy.cust=customers.ID 

鉴于我从客户表所需要的唯一的事情就是一个别名“ID”,同时保持与其他隔列两张桌子。

我while循环最终将改变为:

while($data = mysql_fetch_array($sql)) 
{ 
    echo $data['CUSTOMERID']; // For the customer's ID 
    echo $data['ID']; // For the delivery ID 
} 
2

您将需要显式调用出列,而不是使用*和别名列在您的查询相同的名称:

SELECT 
    del.ID as delivery_id, 
    customers.ID as customer_id, 
    ..... 
FROM deliveries AS del 
LEFT JOIN job_sheet ON job_sheet.job_id=del.jID 
LEFT JOIN hierarchy AS h ON job_sheet.h_str=h.hID 
LEFT JOIN customers ON h.cust=customers.ID 
+0

到目前为止,我尝试了这一点,它很好地工作。我的下一个问题是,如果你需要该表中的所有30列,该怎么办?你需要写出他们每一个人吗? – Dimitri

+0

@Dimitri - 最好的做法是肯定的,列出所有30个。或者,你可以列出你需要别名的那些,用'*'来表示。这会导致一些列被选中不止一次(也许不是什么大问题) –

+0

谢谢!我用你的例子进行了一些调整,它工作的很好! – Dimitri

0

你需要明确指定所需的列。就个人而言,我不会在选择列表中出现“*”这样的大问题,只要它是别名。喜欢的东西:

select del.*, job_sheet.col1, . . .