Mysql 与表B连接时获取表A不同行的有效方法
简单的问题。给出示例表: 表A:Mysql 与表B连接时获取表A不同行的有效方法,mysql,sql,join,query-optimization,distinct,Mysql,Sql,Join,Query Optimization,Distinct,简单的问题。给出示例表: 表A: id | type ---+----- 1 | A 2 | B 3 | C id | a_id | type ---+------+----- 1 | 1 | X 2 | 2 | Y 3 | 1 | X 4 | 3 | Z SELECT a.* FROM a a INNER JOIN b b ON b.a_id = a.id WHERE b.type = 'X' 表B: id | type ---+----- 1 |
id | type
---+-----
1 | A
2 | B
3 | C
id | a_id | type
---+------+-----
1 | 1 | X
2 | 2 | Y
3 | 1 | X
4 | 3 | Z
SELECT a.*
FROM a a
INNER JOIN b b ON b.a_id = a.id
WHERE b.type = 'X'
表B:
id | type
---+-----
1 | A
2 | B
3 | C
id | a_id | type
---+------+-----
1 | 1 | X
2 | 2 | Y
3 | 1 | X
4 | 3 | Z
SELECT a.*
FROM a a
INNER JOIN b b ON b.a_id = a.id
WHERE b.type = 'X'
(为了澄清问题,我省略了其他列)
查询:
id | type
---+-----
1 | A
2 | B
3 | C
id | a_id | type
---+------+-----
1 | 1 | X
2 | 2 | Y
3 | 1 | X
4 | 3 | Z
SELECT a.*
FROM a a
INNER JOIN b b ON b.a_id = a.id
WHERE b.type = 'X'
结果:
id | type
---+-----
1 | A
1 | A
SQL小提琴:
但是我只希望表A有不同的行。我知道,我可以做selectdistinct A.*
,但是我们的表A有大约40列,这个SELECT
可以返回100-10000行。如果数据库必须比较每一列,这不是非常慢吗
或者MySQL是否足够智能,只关注不同操作的主键
提前感谢
:)
使用存在
而不是显式连接:
select a.*
from tablea a
where exists (select 1 from tableb b where b.a_id = a.id and b.type = 'x');
为了提高性能,请在
tableb(a_id,type)
“或者MySQL是否足够智能,可以只关注DISTINCT操作的主键?”=否。select DISTINCT
是一个“行运算符”,它考虑每行的所有部分。愚蠢的DB。它只需查找第一个唯一的
(可能还有索引的
)字段(在大多数情况下id
),并将其用于不同的
。相同的结果,但对比减少99%。。。也许我应该切换到Postgres,在那里我可以说:只需将distinct应用到columnx
,您可以告诉sql dbs只使用一个字段或一组指定的字段,以使其不同。您用于此操作的是groupby
,而不是selectdistinct
。在Postgres中选择distinct
相同selectdistinct-ON
是不同的。我刚刚测试了它,你说得对:selecta.*从a中加入b.a_id=a.id组BY a.id
有效。我一直认为我只能选择GROUP BY
语句中的字段,以及这些列的附加聚合(如sum
ordermax
)。。。我记得前一段时间我在尝试使用groupby
和选择无法分组的字段时遇到了MySQL错误。不要太激动,是的,你可以完全按照你刚才在MySQL中说的做。但事实上,你很可能会得到意想不到的结果。最好的做法仍然是指定要分组的所有字段,然后通过聚合函数处理其他字段。快捷方式方法提供快捷方式结果。