[英]Query on mysql with inner join
我在此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.cpf_cnpj_cliente = jos_users.username
列出这7行jos_clientes_contratos.cpf_cnpj_cliente = jos_users.username
?
您可以执行反联接:
SELECT * FROM t1
LEFT JOIN t2 ON (t1.key = t2.key)
WHERE t2.key IS NULL
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
阅读Joins: http : //blog.codinghorror.com/a-visual-explanation-of-sql-joins/
LEFT Join基本上说...返回左侧表中的所有记录(jos_clientes_contratos),仅返回右侧中匹配的所有记录(jos_users)。 这是外部联接的本质。 左,右或完全外部。 它们从一组或一组返回所有数据,包括不匹配的记录。
由于您对不匹配的jos_clientes_contratos记录感兴趣,因此您需要那些jos_users_username为null的记录。
说“使用左”是可以的,但是为什么呢?实际上,当您使用“ 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.
如果您想拥有所有人,即使他们没有位置,也必须执行OUTER JOIN。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.