Mysql 与表B连接时获取表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 |

简单的问题。给出示例表:

表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  | 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应用到column
x
,您可以告诉sql dbs只使用一个字段或一组指定的字段,以使其不同。您用于此操作的是
groupby
,而不是
selectdistinct
。在Postgres
中选择distinct
相同
selectdistinct-ON
是不同的。我刚刚测试了它,你说得对:
selecta.*从a中加入b.a_id=a.id组BY a.id
有效。我一直认为我只能
选择
GROUP BY
语句中的字段,以及这些列的附加聚合(如
sum
order
max
)。。。我记得前一段时间我在尝试使用
groupby
和选择无法分组的字段时遇到了MySQL错误。不要太激动,是的,你可以完全按照你刚才在MySQL中说的做。但事实上,你很可能会得到意想不到的结果。最好的做法仍然是指定要分组的所有字段,然后通过聚合函数处理其他字段。快捷方式方法提供快捷方式结果。