Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
我的带有两个连接的MySQL查询不起作用_Mysql_Sql - Fatal编程技术网

我的带有两个连接的MySQL查询不起作用

我的带有两个连接的MySQL查询不起作用,mysql,sql,Mysql,Sql,我编写了以下查询,但它不起作用。我想知道如何使它工作。这是一个无法工作的双连接查询 SELECT oc_download.download_id, oc_product_to_download.download_id, oc_download_description.download_id FROM oc_download LEFT JOIN oc_product_to_download ON oc_download.download_id

我编写了以下查询,但它不起作用。我想知道如何使它工作。这是一个无法工作的双连接查询

SELECT oc_download.download_id, oc_product_to_download.download_id, oc_download_description.download_id
  FROM oc_download 
         LEFT JOIN oc_product_to_download
                ON oc_download.download_id = oc_product_to_download.download_id 
         LEFT JOIN
                   oc_download.download_id = oc_download_description.download_id
 WHERE oc_product_to_download.product_id = 89
对于单连接,它可以工作,但是添加第二个连接失败。以下是干净的工作单连接查询:

SELECT oc_download.download_id, oc_product_to_download.download_id, oc_download_description.download_id
  FROM oc_download 
         LEFT JOIN oc_product_to_download
                ON oc_download.download_id = oc_product_to_download.download_id
 WHERE oc_product_to_download.product_id = 89

如何在一个查询中使用多个联接?

您在第二个联接中忘记了表名

SELECT d.download_id, p.download_id, dd.download_id 
FROM oc_download d
LEFT JOIN oc_product_to_download p ON d.download_id = p.download_id 
LEFT JOIN oc_download_description dd ON d.download_id = dd.download_id 
WHERE p.product_id = 89
而您的
where
子句将
左连接
转换为
内部连接
。如果您不希望这样,那么将查询更改为

SELECT d.download_id, p.download_id, dd.download_id 
FROM oc_download d
LEFT JOIN oc_product_to_download p ON d.download_id = p.download_id 
                                  AND p.product_id = 89
LEFT JOIN oc_download_description dd ON d.download_id = dd.download_id 

您在第二次联接中忘记了表名

SELECT d.download_id, p.download_id, dd.download_id 
FROM oc_download d
LEFT JOIN oc_product_to_download p ON d.download_id = p.download_id 
LEFT JOIN oc_download_description dd ON d.download_id = dd.download_id 
WHERE p.product_id = 89
而您的
where
子句将
左连接
转换为
内部连接
。如果您不希望这样,那么将查询更改为

SELECT d.download_id, p.download_id, dd.download_id 
FROM oc_download d
LEFT JOIN oc_product_to_download p ON d.download_id = p.download_id 
                                  AND p.product_id = 89
LEFT JOIN oc_download_description dd ON d.download_id = dd.download_id 

这是您的查询,使用表别名和适当的
join
语法进行了一些修正:

SELECT od.download_id, opd.download_id, odd.download_id
FROM oc_download od LEFT JOIN
     oc_product_to_download opd
     ON od.download_id = opd.download_id LEFT JOIN
     oc_download_description odd
     od.download_id = odd.download_id
WHERE opd.product_id = 89;
您正在使用
左联接
,但这似乎是不必要的。
on
子句正在撤消第一个外部联接,将其转换为内部联接(不匹配的行将具有
NULL
值,该值由
where
子句过滤掉)。事实上,我猜您的数据在被连接的列之间具有定义良好的外键关系。如果是这种情况,则应使用
内部联接
(或仅使用
联接
)进行查询:

SELECT od.download_id, opd.download_id, odd.download_id
FROM oc_download od JOIN
     oc_product_to_download opd
     ON od.download_id = opd.download_id JOIN
     oc_download_description odd
     od.download_id = odd.download_id
WHERE opd.product_id = 89;

左连接
具有误导性,因为它意味着某些键可能不匹配。您还可能会混淆优化器。

这是您的查询,使用了表别名和正确的
连接语法:

SELECT od.download_id, opd.download_id, odd.download_id
FROM oc_download od LEFT JOIN
     oc_product_to_download opd
     ON od.download_id = opd.download_id LEFT JOIN
     oc_download_description odd
     od.download_id = odd.download_id
WHERE opd.product_id = 89;
您正在使用
左联接
,但这似乎是不必要的。
on
子句正在撤消第一个外部联接,将其转换为内部联接(不匹配的行将具有
NULL
值,该值由
where
子句过滤掉)。事实上,我猜您的数据在被连接的列之间具有定义良好的外键关系。如果是这种情况,则应使用
内部联接
(或仅使用
联接
)进行查询:

SELECT od.download_id, opd.download_id, odd.download_id
FROM oc_download od JOIN
     oc_product_to_download opd
     ON od.download_id = opd.download_id JOIN
     oc_download_description odd
     od.download_id = odd.download_id
WHERE opd.product_id = 89;

左连接
具有误导性,因为它意味着某些键可能不匹配。您还可能会混淆优化器。

您在
子句和表定义中缺少一个
。是谁写的:)有趣-1。此查询中存在明显的语法错误。这个问题不太可能对未来的访问者有所帮助。如果你格式化你的查询(见调整后的问题),你可以看到你更想念自己的地方easily@SalmanA . . . 这些或许是投票结束该问题的好理由(事实上,有一个明确的结束理由)。然而,这也不一定是否决它的理由。你在
子句和表定义中缺少了一个
。谁否决了这个:)有趣-1。此查询中存在明显的语法错误。这个问题不太可能对未来的访问者有所帮助。如果你格式化你的查询(见调整后的问题),你可以看到你更想念自己的地方easily@SalmanA . . . 这些或许是投票结束该问题的好理由(事实上,有一个明确的结束理由)。然而,这也不一定是否决它的理由。