我在这个jos_clientes_contratos表中有54567行;
执行查询时:
SELECT * FROM `jos_clientes_contratos`
INNER JOIN jos_users
ON jos_clientes_contratos.cpf_cnpj_cliente = jos_users.username;
它会返回54560行。这意味着结果中没有列出7行。如何列出jos_clientes_contratos中没有此条件{7}的这7行?
答案 0 :(得分:4)
您可以进行反加入:
SELECT * FROM t1
LEFT JOIN t2 ON (t1.key = t2.key)
WHERE t2.key IS NULL
答案 1 :(得分:2)
SELECT *
FROM `jos_clientes_contratos`
LEFT JOIN jos_users
ON jos_clientes_contratos.cpf_cnpj_cliente = jos_users.username
WHERE jos_users.username is null
阅读联接:http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
LEFT Join基本上说...返回左表(jos_clientes_contratos)中的所有记录,只返回右边(jos_users)匹配的记录。这是外连接的本质。左,右或全外。它们返回来自一个或两个集合的所有数据,包括不匹配的记录。
由于您对不匹配的jos_clientes_contratos记录感兴趣,因此您希望jos_users_username为空的记录。
答案 2 :(得分:-1)
说'使用左"没关系,但为什么呢? 事实上,当你使用" INNER JOIN" ,Mysql开始搜索WHERE中的所有数据,然后将它们推入" INNER JOIN"结果,只获得WHERE中与INNER匹配的数据。
例:
John -> Kansas
Michael -> California
Mike -> California
Moshe -> Jerusalem
Mathew-> no data in he location part
SELECT name, location
FROM TAB_NAME
INNER JOIN TAB_TOWN
ON tname_town = tlocation
WHERE tname_name = "M%"
我就是那样你会得到
Michael -> California
Mike -> California
Moshe -> Jerusalem
but NOT Mathew as Mathew don't have location.
如果您想要所有人,即使他们没有位置,您也必须执行外部联接。
SELECT name, location
FROM TAB_NAME
LEFT OUTER JOIN TAB_TOWN
ON tname_town = tlocation
WHERE tname_name = "M%"
这将返回
Michael -> California
Mike -> California
Moshe -> Jerusalem
Mathew-> undefined
希望这个帮助
啊,看看这里:简单,基本,好! http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins