繁体   English   中英

使用内部联接在mysql上查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM