Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL左连接_Php_Mysql_Sql - Fatal编程技术网

Php MySQL左连接

Php MySQL左连接,php,mysql,sql,Php,Mysql,Sql,可能重复: 我有以下声明: $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"; 我的问题是“customers”表有一个名为ID的列

可能重复:

我有以下声明:

$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";
我的问题是“customers”表有一个名为ID的列,“deliveries”表也有一个名为ID的列。当我运行while循环以输出结果时,问题就开始了

while($data = mysql_fetch_array($sql))
{
     echo $data['ID'];
}
它输出最后一个联接的表的值。。。我怎样才能把两者分开呢?我的意思是,我需要能够从两个表中输出'ID',但在查询中,最后一个表获胜。重命名列不是一个选项


任何输入?

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

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

您需要显式指定所需的列。就我个人而言,我对选择列表中的“*”没有太大问题,只要它是别名。比如:

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

我通过一些调整找到了答案:

    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
考虑到我只需要从customers表中获得一个别名“ID”,同时保留其他两个表中的每一列

我的while循环最终将更改为:

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

决不要在联接查询中选择*。始终明确显示
SELECT
列表中的列,并指定别名:
SELECT h.ID作为h\u ID,del.ID作为del\u ID
到目前为止,我已经尝试过了,效果很好。我的下一个问题是,如果您需要该表中的所有30列,该怎么办。你必须把每一个都写出来吗?@Dimitri-最好的做法是,把所有30个都列出来。或者,您可以列出需要使用别名的名称,然后使用
*
进行后续操作。这将导致某些列被多次选中(可能不是什么大问题),谢谢!我对你的例子做了一些调整,效果很好!