Mysql,多个左连接 - 3个表

时间:2016-06-10 12:02:01

标签: mysql sql

我在MysQL中有多个连接问题 我有3张桌子:

  • cms_data_company
  • cms_data_company_categories
  • cms_datasrc_category

来自以下网站的示例记录: 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的字段名称

我需要按如下方式加入:

    来自cms_data_company的
  1. id 与来自cms_data_company_categories的 company_id 相匹配
  2. 然后匹配 category_id 来自cms_datasrc_category的 ID 的cms_data_company_categories(仅限datasrc = 0且parent = 0的这些记录)
  3. 使用cms_data_company
  4. 中的所有字段将名称作为新列返回

    我想我可以把它弄得乱七八糟,但我的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?

1 个答案:

答案 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子句中。