简单的问题。给出示例表:
表A:
id | type
---+-----
1 | A
2 | B
3 | C
表B:
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小提琴:http://sqlfiddle.com/#!2/e6138f/1
但我只想要表A的不同行。我知道,我可以SELECT DISTINCT a.*
,但我们的表A有大约40列,而这个SELECT
可以返回100-10000行。如果数据库必须比较每一列,那是不是非常慢?
或者MySQL是否足够智能,只关注DISTINCT操作的主键?
提前致谢:)
答案 0 :(得分:1)
使用exists
代替显式联接:
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)
上创建索引。