我的带有两个连接的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 . . . 这些或许是投票结束该问题的好理由(事实上,有一个明确的结束理由)。然而,这也不一定是否决它的理由。