【问题标题】:left join two separate queries左连接两个单独的查询
【发布时间】:2013-12-04 15:25:35
【问题描述】:

我有两个独立的查询,它们几乎返回相同的内容:

select id 
from t 
where id<>'' 
GROUP BY id 
having count(*) >= 2;

select id 
from t2 
where id is not null 
GROUP BY id 
having count(*) >= 2 
ORDER BY id ASC;

其值出现多次的 id 列表。第一个查询返回的比第二个多,所以我需要以某种方式离开它们以获取第一个查询中而不是第二个查询的结果。我试图做一个左连接,但它不能正常工作。

我也尝试了以下方法,但无济于事:

select id 
from t 
where id<>'' 
GROUP BY id 
having count(*) >= 2 
  not in (select id from t2 where id is not null GROUP BY id having count(*) >= 2 
          ORDER BY id ASC)

其他信息

查询一为我提供了表 1 具有相同值的所有 id,查询 2 为我提供了表 2 的所有相同值。还有一些额外的陷阱,例如表 1 中有一些空白 id 而有一些表 2 中的空值,因此条件不包括前者的空白和后者的空值。所以我得到了这两个几乎相同的单独结果,除了结果 1 中声称结果 2 中没有 但只有在运行这些查询时,因为它们在表 1 中重复但没有在表 2 中。尽管它们确实存在于表 2 中。因此,t1.id t2.id 的简单左连接将不起作用,因为它们确实存在于 t2 中。

【问题讨论】:

  • 实际上希望查询做什么?
  • @ExplosionPills 在我的第一个查询中给我那些不在第二个查询中的。

标签: mysql left-join outer-join


【解决方案1】:

您想选择t1 中不在t2 中的ID。 JOIN on t2 并确保结果为NULL

SELECT t.id
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE t2.id IS NULL
GROUP BY t.id
HAVING COUNT(t.id) > 1

【讨论】:

  • 但我只需要那些超过 count 超过 2 的,所以基本上那些额外的条件?
  • @EduardoDennis 你的意思是 t1 中的 ids 不是 t2 中的 t1 中有多个的 ids?
  • 查看我发布的其他信息,对于我的原始帖子含糊不清感到抱歉。
  • @EduardoDennis 查看编辑; id 上是否有两个表的键?
【解决方案2】:
SELECT t.id, t2.id FROM t 
LEFT OUTER JOIN t2
ON t.id <> t2.id
WHERE t.id<>'' 
GROUP BY t.id having count(t.id) >= 2 
ORDER BY t.id ASC

我假设您在子查询之前的 not in 部分实际上意味着表 t 和 t2 中的 id 不同,因此添加了条件 t.id t2.id

编辑

SELECT t.id  FROM t 
WHERE t.id<>''
AND t.id NOT IN (SELECT id FROM t2  where id is not null )
GROUP BY t.id having count(t.id) >= 2 
ORDER BY t.id ASC

SQLFIDDLE

【讨论】:

  • 它永远运行 :-/ 并且不返回任何东西
  • @EduardoDennis 检查我的更新查询(编辑部分)。
  • 但是假设你将一个 4 添加到第二个它不会在结果中返回 4。但它应该是因为第二个中的 4 只有一次我试图只取回第一个表中重复的值,而第二个表中不重复的值,无论它们是否出现一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多