Mysql JOIN 四张表,两张关键表

Posted

技术标签:

【中文标题】Mysql JOIN 四张表,两张关键表【英文标题】:Mysql JOIN of four tables with two key tables 【发布时间】:2010-09-29 17:47:31 【问题描述】:

当涉及到更复杂的查询时,我不愿承认我对 mysql 的了解不足。基本上我有四个表,其中两个包含我要返回的数据,两个是链接数据的关系表。 Table A 的存在只是为了为 Table D.aID 提供填充。

+--------+ +--------+ +--------+ +-----------+ +-----------+
|Table A | |Table B | |Table C | |  Table D  | |  Table E  |
+---+----+ +---+----+ +---+----+ +---+---+---+ +---+---+---+
|aID|name| |bID|name| |cID|name| |dID|aID|bID| |eID|dID|cID|
+---+----+ +---+----+ +---+----+ +---+---+---+ +---+---+---+
| 1 | a_1| | 1 | b_1| | 1 | c_1| | 1 | 1 | 1 | | 1 | 1 | 1 |
+---+----+ | 2 | b_2| | 2 | c_2| | 2 | 1 | 2 | | 1 | 1 | 2 |
           +---+----+ | 3 | c_3| +---+---+---+ +---+---+---+
                      +---+----+

使用这些表创建的关系是:Table A > Table B > Table C。我要的数据属于Table B > Table C关系。

+--------+---------+--------+---------+
|tblB.bID|tblB.name|tblC.cID|tblC.name|
+--------+---------+--------+---------+
|    1   |    a_1  |    1   |   c_1   |
|    1   |    a_1  |    2   |   c_2   |
|    2   |    a_2  |  NULL  |   NULL  |
+--------+---------+--------+---------+

但是,为了确保我遵循正确的路径,我需要获取 Table A > Table B 关系 Table C 所属的 Table B。我意识到允许重复的name 值让我自己的事情变得更加困难,但我宁愿拥有小表和更复杂的查询,而不是臃肿的表和更简单的查询。我正在使用的查询是

SELECT * FROM `Table E`
LEFT JOIN `Table D` ON (`Table B`.bID = `Table D`.bID)
RIGHT JOIN `Table E` ON (`Table D`.dID = `Table E`.dID))
RIGHT JOIN `Table C` ON (`Table E.cID = `Table C`.cID);

但是到目前为止它还没有奏效。提交查询时返回此错误:

ERROR 1066 (42000): Not unique table/alias: 'Table D'

关于如何让它发挥作用的任何想法?这甚至可能吗?

【问题讨论】:

正如您提到的需要简单查询(并且由于您的键列具有匹配的名称),您可能希望考虑将 on (tablex.xID = tabley.xID) 替换为 using xID 我不知道我能做到这一点。谢谢你的提示。 【参考方案1】:

您提交的查询与您提供给我们的表结构几乎没有相似之处! Table D.national_regionID 是什么?还是modx.coverage_state

虽然一般不要混合左右连接。此外,查询中使用的每个表都必须遵循FROM 或遵循JOIN。您似乎在连接条件中使用了Table BTable C,而从未将它们添加到查询中。

【讨论】:

Table D.national_regionIDmodx.coverage_state 是搜索和替换失败后实际查询的残余。所以你说查询应该看起来类似于这样: SELECT * FROM Table E RIGHT JOIN Table B ON (Table B.bID = Table D.bID) RIGHT JOIN Table D USING dID RIGHT JOIN Table C使用cID; 感谢您的回复。写完我的初步回复后,我又看了一遍我的查询,并试图让它看起来更像它应该的样子。这样做时,我使用上面发布的查询解决了我的错误,并将在答案线程中重新发布。【参考方案2】:

感谢 Martin Smith,我能够想出我在此处发布的解决方案。我希望这可能对其他人有所帮助。

SELECT  tblB.bID,
    tblB.name,
    tblC.cID,
    tblC.name
FROM Table E 
RIGHT JOIN Table B ON (Table B.bID = Table D.bID)
RIGHT JOIN Table D USING dID
RIGHT JOIN Table C USING cID;

【讨论】:

以上是关于Mysql JOIN 四张表,两张关键表的主要内容,如果未能解决你的问题,请参考以下文章

abap 怎样使两张内表合成一个内表

oracle 想把三张表关联起来,怎么关联?

MySQL中3表join流程分析

MySQL--join算法(Nested-Loop JoinBlock Nested-Loop Join)

MySql多表查询

Sql_join left right