困惑,MySQL选择两个表 - 如果一个表丢失,则返回另一个表

时间:2015-12-28 13:06:07

标签: mysql sql

我的代码是:

SELECT *
FROM accounts,test
WHERE accounts.Username = test.Username AND test.Username IN ('BigD')

如果测试表中没有任何内容,我仍然想要返回accounts表中的内容。目前,只有两个表都获得了一些信息才会返回信息。怎么做? 听说如果你使用FULL JOIN就可以了,但是不知道如何在这里实现它。

3 个答案:

答案 0 :(得分:2)

尝试LEFT JOIN

SELECT *
FROM accounts LEFT JOIN test
    ON accounts.Username = test.Username
WHERE test.Username IN ('BigD')

您的原始查询是使用旧的ANSI-89连接方式编写的,其中连接的条件显示在WHERE子句中。除了难以阅读之外,还很难弄清楚如何修改查询以获得所需内容。

答案 1 :(得分:0)

你不需要一个完整的加入,但是一个外部加入:

SELECT * FROM accounts 
LEFT OUTER JOIN test ON accounts.Username= test.Username 
WHERE test.Username IN ('BigD')

因此,您将获得" account"的所有行并且仅匹配来自" test"的行使用" test.Username IN(' BigD')" !

如果您只希望在帐户中获得一个匹配并列出测试中的所有匹配项,则可以通过以下方式撤消连接:

SELECT * FROM accounts 
RIGHT OUTER JOIN test ON accounts.Username= test.Username 
WHERE test.Username IN ('BigD')

注意:" OUTER"关键字是optionnal!

答案 2 :(得分:0)

正确的语法将WHERE中的条件移动到ON子句,因为它位于第二个表上。

但是,您可能还是希望在第一个表上进行测试:

SELECT a.*, t.*
FROM accounts a LEFT JOIN
     test t
     ON a.Username = t.Username
WHERE a.Username IN ('BigD');

如果您不希望在结果集中两次username,请使用USING代替ON

SELECT a.*, t.*
FROM accounts a LEFT JOIN
     test t
     USING (username) 
WHERE Username IN ('BigD');