mysql获取具有特定值的外部记录的记录

时间:2015-04-07 14:53:52

标签: mysql

我有两张桌子

Parent:
    +--+---------+
    |id|   text  |
    +--+---------+
    | 1|  Blah   |
    | 2|  Blah2  |
    | 3|  Blah3  |
    +--+---------+

 Children
    +--+---------+---------+
    |id|parent_id| table_id|
    +--+---------+---------+
    | 1|   1     | 1       |
    | 2|   1     | 3       |
    | 3|   2     | 2       |
    +--+---------+---------+

我想找到父母有一个table_id为1和3的孩子。 目前我正在使用以下查询

SELECT * 
FROM  Parent
WHERE id
IN (
    SELECT parent_id
    FROM Children
    WHERE table_id = 1
)
AND id
IN (
    SELECT parent_id
    FROM Children
    WHERE table_id = 3
)

由于我有数千条记录,因此查询运行速度非常慢。

是否有更快的查询来执行它?

3 个答案:

答案 0 :(得分:1)

您可以让mysql EXPLAIN 执行您的计划:查看手册中的this chapter。从那里,您可以优化查询的速度。有不同的方法,它是一个广泛的领域 - 但总的来说,它是一个很好的开始,以最小化包含的连接和内部查询的数量和宽度。

答案 1 :(得分:0)

有很多方法可以做到这一点,而正确索引的一种方法可以使它快速成为

select p.* from parent p 
join children c on c.parent_id = p.id 
where c.table_id = 1 
and exists ( 
  select 1 from children c1 
  where c1.parent_id = c.parent_id 
  and c1.table_id = 3
);

可以添加为

的索引
alter table parent add index id_idx(id);
alter table children add index parent_idx(parent_id);
alter table children add index table_id_idx(table_id);

答案 2 :(得分:-1)

SELECT c.parent_id, p.text,
SUM(CASE WHEN c.table_id=1 THEN 1 ELSE 0 END) as t_1,
SUM(CASE WHEN c.table_id=3 THEN 1 ELSE 0 END) as t_3
FROM  Children c
LEFT JOIN Parent p
ON c.parent_id = p.id
WHERE c.table_id IN ( 1, 3)
GROUP BY c.parent_id
HAVING t_1>0 AND t_3>0