简体   繁体   English

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

[英]My MySQL query with two JOINs does not work

I have written the following query, which does not work. 我写了下面的查询,它不起作用。 I want to know how to make it work. 我想知道如何使其工作。 It is a two-JOIN query which fails to work. 这是一个两联接查询,无法正常工作。

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

With single JOIN it works, but adding the second JOIN it fails. 使用单个JOIN可以工作,但是添加第二个JOIN则失败。 here is the clean working one-JOIN query: 这是干净的工作一联接查询:

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

How should I use multiple JOIN in one single query? 如何在一个查询中使用多个JOIN?

You forgot the table name in the 2nd join 您忘记了第二个联接中的表名

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

And your where clause turns your left join into an inner join . 您的where子句将您的left join变成inner join If you don't want that then change your query to 如果您不希望这样做,则将查询更改为

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 

This is your query fixed up a bit, using table aliases and proper join syntax: 这是您的查询,使用表别名和正确的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;

You are using left join , but this appears to be unnecessary. 您正在使用left join ,但这似乎是不必要的。 The on clause is undoing the first outer join, turning it into an inner join (unmatched rows would have a NULL value, which are filtered out by the where clause). on子句撤消第一个外部联接,将其转换为内部联接(不匹配的行将具有NULL值,并由where子句过滤掉)。 In fact, I would guess that your data has well defined foreign key relationships among the columns being joined. 实际上,我想您的数据在要连接的列之间具有定义明确的外键关系。 If this is the case, you should use inner join (or just join ) for the query: 如果是这种情况,则应对查询使用inner join (或仅使用join ):

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;

The left join is misleading because it implies that some keys might not match. left join具有误导性,因为它暗示某些键可能不匹配。 You also run the risk of confusing the optimizer. 您还冒着混淆优化器的风险。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM