不知道如何操作,但我找到了一种有效的方法,尽管某些列中的数据不正确。因此,现在,我将留下“已解决”指示,但我可能需要此文档来获得其他帮助。不过也可以删除。
抱歉,但我认为答案不在于“具有相似标题的问题”。我很可能是错的,但我已经搜索了很多我能理解的文档,但这可能就像我过去使用 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 类型。
我能拔掉的头发非常有限,所以我需要你的帮助。
最佳答案
好吧,如果不知道您的表架构、数据,也没有明确的预期结果,就很难猜测您正在寻找什么。但这将从成员资格表中获取所有行,无论它们在其他表中是否匹配:
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
我扫描 documentation在 USING
上,找不到任何对此的引用,但我的意思是我不确定它从哪个表中选择列。这:
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)
不清楚在与contact
连接时哪个表使用memno
。在上一个示例的第一个左连接中,没有其他表可供选择,因此它将连接 m
和 a
,而 m
将是左连接部分。但是当加入c
时,你将有2个memno
:m.memno
和a.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
我认为这不是您要找的。不要认为指定字段和它们来自的表是一种不好的做法......这样意图就更清晰了。
关于mysql - 多个表的正确连接/左连接 +,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9753892/