【问题标题】:using distinct rows for join mysql使用不同的行来连接 mysql
【发布时间】:2015-08-01 14:48:03
【问题描述】:

假设我有表 A、B A 中的 ID 是唯一的,但表 B 中的 ID 不是唯一的

我想选择 DISTINCT ID

查询 1:

从 A a LEFT JOIN B b ON a.ID = B.ID WHERE 中选择 DISTINCT ID ...

查询 2:

SELECT DISTINCT ID FROM A WHERE ID IN (SELECT DISTINCT ID FROM B where ...)

SELECT DISTINCT ID FROM A a LEFT JOIN (SELECT DISTINCT ID FROM B) b ON a.ID = B.ID WHERE ...

结果是一样的,但是

在查询 1 中发生的情况是临时表的空间更多,因为表 B 中的多行将带有重复的 ID

在查询 2 中,我能够优化空间和进一步处理,因为它将具有所有不同 ID 的有限行

有没有什么方法可以使用表 B 中的 DISTINCT 行使用连接并避免子查询?

实际上,我什至有表 C,我将加入它,所以在进一步加入表 C 时,我需要注意参与第二次加入的行数。

【问题讨论】:

  • 注意:查询 1 和 2 的结果不必相同,因为您使用的是LEFT JOIN,所以查询 1 也会返回表 B 中不匹配的行。
  • 我已经对问题进行了编辑,我们假设根据我们提出的条件我们有相同的结果

标签: mysql


【解决方案1】:
SELECT DISTINCT ID FROM A a LEFT JOIN (SELECT DISTINCT ID FROM B) b ON a.ID = B.ID WHERE ...

这是你想要的吗?

编辑,让答案更明显:

由于您的 A 是唯一的,但 B 不是,您可以交换值:

SELECT DISTINCT ID FROM B b LEFT JOIN A a on a.ID = b.ID WHERE...

【讨论】:

  • 是否有办法避免子查询,因为表 B 中的 DISTINCT 行会更高,子查询可能会影响性能
  • 看起来你的 A 是唯一的,但 B 不是,所以你可以这样做:SELECT DISTINCT ID FROM B b LEFT JOIN A a on a.ID = b.ID
  • 好吧,如果它对你有用,你可以将我的答案标记为正确的。
猜你喜欢
  • 2012-07-22
  • 2011-03-06
  • 2013-01-22
  • 2013-09-24
  • 2012-08-27
  • 2012-12-10
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多