在MySQL查询中多次从另一个表加入

时间:2011-11-07 17:22:39

标签: mysql join

我正在尝试在同一个MySQL表上进行多个连接,但是没有得到我期望获得的结果。希望有人可以指出我的错误。

Table 1 -  cpe Table

|id | name
|----------
| 1 | cat
| 2 | dog
| 3 | mouse
| 4 | snake
-----------

Table 2 - AutoSelect

|id  | name   |  cpe1_id |  cpe2_id  | cpe3_id |
|-----------------------------------------------
| 1  | user1  |  1       |  3        | 4       |
| 2  | user2  |  3       |  1        | 2       |
| 3  | user3  |  3       |  3        | 2       |
| 4  | user4  |  4       |  2        | 1       |
------------------------------------------------

我希望看到

的输出
user1 | cat   | mouse  |  snake  |
user2 | mouse | snake  |  dog    | 
..etc

这是我试过的

SELECT * FROM AutoSelect
LEFT JOIN cpe ON 
( cpe.id = AutoSelect.cpe1_id ) AND
( cpe.id = AutoSelect.cpe2_id ) AND
( cpe.id = AutoSelect.cpe3_id )

我得到空白的结果。我以为我知道如何进行这些连接,但显然当我尝试将cpe?_id与cpe表的名称匹配时。

提前感谢您的任何帮助。

3 个答案:

答案 0 :(得分:1)

你还需要连接3次。目前,您的查询仅加入1次与3个关于加入的标准。这应该做:

SELECT a.name, cpe1.name, cpe2.name, cpe3.name FROM AutoSelect as a
LEFT JOIN cpe as cpe1 ON ( cpe1.id = a.cpe1_id ) 
LEFT JOIN cpe as cpe2 ON ( cpe2.id = a.cpe2_id ) 
LEFT JOIN cpe as cpe3 ON ( cpe3.id = a.cpe3_id )

你可能意味着INNER JOIN而不是LEFT JOIN,除非你的AutoSelect表允许使用NULL值。

答案 1 :(得分:0)

我认为你的设计是错误的。

使用这样的表格,你可以按照它在关系数据库中的方式得到它:

table 1 : animal
 id  name
 1   cat
 2   dog
 3   mouse
 4   snake


table 2 : user
|id  | name   |
|--------------
| 1  | user1  |
| 2  | user2  |
| 3  | user3  |
| 4  | user4  |

table 3 : association
|id_user | id_animal|
|--------------------
| 1      | 1        |
| 1      | 3        |
| 1      | 4        |
| 2      | 3        |
| 2      | 1        |
| 2      | 2        |
| 3      | 3        | 
| 3      | 2        
| 4      | 4        |
| 4      | 2        |
| 4      | 1        |
---------------------

然后:

从用户u,动物a,关联屁股中选择u.name,a.name,其中ass.user_id = u.id和ass.animal_id = a.id;

答案 2 :(得分:0)

在这种情况下,您的解决方案将无法生成良好的动态数据库。还有其他方法可以组合多个表。我可以通过自己的数据库向您展示您应该使用什么以及何时应该使用此解决方案。该计划是荷兰语,但你可能会理解这些关键词。

和你一样,我必须将我的风车与一个千瓦时电表结合起来,这必须测量我的风车的能量产生。你应该做的,就是这种情况,正在制作另一张桌子(在我的情况下是molenkWhlink)。确保您的表是INNODB类型(用于制作外键)。我所做的是通过在新表中放置其ID(在荷兰语Volgnummer中)的指针(外键)来组合我的米和铣刀。您可能不需要的优势,但我确实这样做的事实是,当链接或取消链接时,我能够使用连接和断开信息(如时间戳和米值)扩展额外的表。这使您的数据库更加动态。

就我而言,我还有一张表(metingoverzicht)表。正如你在计划中看到的那样,我有两行从Metingoverzicht到molenkwhlink。原因很简单。我采取的所有措施都将保存在表格Metingoverzicht中。每日预测(已安排)将有一个特殊的布尔值,但是计划外的安排,我也将保存在这里,关闭了bollean。当切换仪表时,我需要离开仪表的终值和新仪表的起始值,以计算当今的能量产生的值。这是您的解决方案进入的地方,额外的表格不起作用。通常,当您只需要另一个表中的一个值时,将使用JOIN。在这种情况下的问题是,我在1个链接中有2个meassurementID(1个用于连接,1个用于断开连接)。它们都指向同一个表列,因为它们都需要保存相同类型的信息。那时你可以使用从一个表到另一个表的双JOIN。因为,这两个值仅使用一次,并且只需要保存在不同的位置以避免将1个操作存储在不同的位置,这应该始终避免。

http://s1101.photobucket.com/user/Manuel_Barcelona/media/schemedatabase.jpg.html