我在MysQL中有多个连接问题 我有3张桌子:
来自以下网站的示例记录: cms_data_company :
+----+-----------+------------+
| id | name | address |
+----+-----------+------------+
| 1 | Name1 | Samplestr1 |
+----+-----------+------------+
| 2 | Name2 | Samplestr2 |
+----+-----------+------------+
| 3 | Name3 | Samplestr3 |
+----+-----------+------------+
来自以下网站的示例记录: cms_data_company_categories (它包含Company_id字段和category_id)点是一个company_id有多条记录。
+----+-----------+------------+
| id | company_id| category_id|
+----+-----------+------------+
| 1 | 2 | 14 |
+----+-----------+------------+
| 2 | 2 | 11 |
+----+-----------+------------+
| 3 | 1 | 15 |
+----+-----------+------------+
来自以下网站的示例记录: cms_datasrc_category (这是一个我只需要行所在的问题:
datasrc = 1 AND parent = 0
+----+-----------+------------+-----------+
| id | datasrc | parent |name |
+----+-----------+------------+-----------+
| 1 | 1 | 0 |category1 |
+----+-----------+------------+-----------+
| 2 | 2 | 0 |category2 |
+----+-----------+------------+-----------+
| 3 | 3 | 5 |category3 |
+----+-----------+------------+-----------+
我想要回忆的是:
来自cms_data_company的所有字段和来自cms_datasrc_company的字段名称
我需要按如下方式加入:
我想我可以把它弄得乱七八糟,但我的MySQL声明如下:
select * ,cms_datasrc_category.name_en
from cms_data_company
LEFT JOIN cms_data_company_categories.company_id
ON cms_data_company.id = cms_data_company_categories.company_id
LEFT JOIN cms_datasrc_category
ON cms_data_company_categories.category_id = cms_datasrc_category.id
WHERE cms_datasrc_category.datasrc = 1 AND cms_datasrc_category.parent = 0
似乎它正在以某种方式工作但是,只有来自cms_data_company的记录,其中查询可以找到某些东西。当没有匹配的字段时,我想更改我的statemat以显示NULL。
这是因为WHERE适用于所有Query?
答案 0 :(得分:1)
当您使用left join
时,除第一个表外的所有条件都应在on
子句中:
SELECT *, cdc.name_en
FROM cms_data_company dc LEFT JOIN
cms_data_company_categories.company_id c
ON dc.id = c.company_id LEFT JOIN
cms_datasrc_category cdc
ON c.category_id = cdc.id AND
cdc.datasrc = 1 AND cdc.parent = 0;
注意:
select *
已经选择了所有表中的所有列。不需要包含其他列。或者,更好的是,列出您真正需要的列。on
子句中。