适当连接多个表/左连接+

时间:2012-03-17 21:30:28

标签: mysql

我不知道如何使用它,但我找到了一种方法,虽然有些列中的数据不正确。所以现在,我将留下一个SOLVED指示,但我可能需要此文档以获得其他帮助。它可以被删除。

很抱歉,但我认为答案不在于“有类似名称的问题”。我可能错了,但我搜索并搜索了我能理解的文档,但它可能就像我过去的IBM主要框架手册一样。如果您不知道确切的单词,则无法找到答案。

所以这里是:

SELECT * FROM membership LEFT JOIN address2 USING(memno)
CROSS JOIN contact USING(memno)
CROSS JOIN workers USING(memno)
CROSS JOIN comments USING(memno)
JOIN candidates USING(memno)

尝试了很多方法。我想过说我尽可能地尝试过但是我显然没有以正确的方式做到这一点。当我只做第一行时,我得到了所有正确的列,并且我在数据库中得到了所有五行表。

当我添加第二行时,它可以工作,但我只获得两行。它通过“评论”行工作。它没有做最后一行“候选人”。

我需要获得的是所有五行(成员资格表中的行数)。

交叉加入是一个问题。我认为它限制了行,因为其中一个表中只有两行,并且它在限制范围内都是双向的。

所以我认为我需要的是第二行,第三行和第四行的正确JOIN以及最后一行的另一个JOIN类型。

我的头发非常有限,所以我需要你的帮助。

2 个答案:

答案 0 :(得分:1)

好吧,如果不知道你的表架构,数据,也没有明确的预期结果,那么猜测你正在寻找什么就有点困难了。但是这将从成员资格表中获取所有行,无论它们是否在其他表上匹配:

SELECT * FROM membership
LEFT JOIN address2 USING(memno)
LEFT JOIN contact USING(memno)
LEFT JOIN workers USING(memno)
LEFT JOIN comments USING(memno)
LEFT JOIN candidates USING(memno)

修改

就个人而言,在使用像这样的链式左连接时,我不相信USING。我会确保通过显式添加表来加入:

SELECT * FROM membership m
LEFT JOIN address2 a on m.memno = a.memno
LEFT JOIN contact con on m.memno = con.memno
LEFT JOIN workers w on m.memno = w.memno
LEFT JOIN comments com on m.memno = com.memno
LEFT JOIN candidates can on m.memno = can.memno

已扫描 USING上的documentation并找不到任何对此的引用,但我的意思是我不确定它从哪个表中选择列。这样:

SELECT * FROM membership m
LEFT JOIN address2 a on m.memno = a.memno
LEFT JOIN contact con on m.memno = con.memno

使用别名m作为左连接的左侧部分,所以我相信我会看到所有的成员,无论是否有联系人或地址。但是,这个:

SELECT * FROM membership m
LEFT JOIN address2 a USING(memno)
LEFT JOIN contact c USING(memno)

在加入memno时,不清楚使用contact的表格。在上一个示例的第一个左连接中,没有其他表可供选择,因此它将加入ma,而m将是左侧部分。但加入c后,您将获得2 memnom.memnoa.memno。如果USING选择m,则查询将相同,但如果选择c,则之前的查询将转换为:

SELECT * FROM membership m
LEFT JOIN address2 a on m.memno = a.memno
LEFT JOIN contact c on a.memno = c.memno

我认为这不是你想要的。不要认为指定它们来自的字段和表格是不好的做法......意图更加清晰。

答案 1 :(得分:0)

您需要的连接类型取决于表之间的关系类型。有两种常见的情况。

第一种情况是当您对详细记录感兴趣时,您需要参考主记录。由于始终存在相关的主记录,因此内部连接就足够了。

第二种情况是当您对主记录感兴趣时,您需要参考可选的详细记录。在这种情况下,您通常需要左连接。

第二种情况可以分为两个子案例,具体取决于详细记录的数量是否限制为最大值1,但这不会影响所使用的连接类型。