我用2个表做了一个非常简单的例子:
表A:user_client
id | username
---------------
2222 | test
表B:user_client_contact
client_id | country
--------------------
2222 | latvia
2222 | estonia
我得到了结果:
id
-----
2222
2222
但我期望的结果是:
id
-----
2222
SQL:
select
user_client.id
from user_client
left join user_client_contact on user_client_contact.client_id = user_client.id
请在此处查看sqlfiflle:http://sqlfiddle.com/#!9/270cc/7
答案 0 :(得分:3)
根据您的查询:
select
user_client.id
from user_client
left join user_client_contact on
user_client_contact.client_id = user_client.id
您正在加入id和client_id。 user_client_contact中有两个条目,值为2222,这意味着user_client.id将出现两次,一个位于user_client_contact中的每个匹配行之前。
您可以通过以下几种不同方式解决此问题:
select
distinct user_client.id
from user_client
left join user_client_contact on
user_client_contact.client_id = user_client.id
你也可以这样做:
SELECT user_client.id FROM user_client
WHERE User_client.id IN (select client_id FROM user_client_contact)
注意:有一种误解,即子查询会自动变慢,但这不一定是事实。它确实根据具体情况而有所不同,但通常优化器会考虑子查询并加快它们的速度,特别是与不同的相比。这是article比较两者。
答案 1 :(得分:2)
您可以在select语句中添加distinct:
select distinct user_client.id
from user_client
left join user_client_contact
on user_client_contact.client_id = user_client.id
DISTINCT关键字可用于仅返回不同的(不同的)值。
8关于不同。