【发布时间】:2011-02-11 04:16:20
【问题描述】:
我有两张桌子,House 和 Person。对于 House 中的任何一行,Person 中可以有 0、1 或多个对应行。但是,在这些人中,最多有一个人的状态为“ACTIVE”,其他人的状态均为“CANCELLED”。
例如
SELECT * FROM House LEFT JOIN Person ON House.ID = Person.HouseID
House.ID | Person.ID | Person.Status
1 | 1 | CANCELLED
1 | 2 | CANCELLED
1 | 3 | ACTIVE
2 | 1 | ACTIVE
3 | NULL | NULL
4 | 4 | CANCELLED
我想过滤掉取消的行,得到这样的结果:
House.ID | Person.ID | Person.Status
1 | 3 | ACTIVE
2 | 1 | ACTIVE
3 | NULL | NULL
4 | NULL | NULL
我通过以下子选择实现了这一点:
SELECT *
FROM House
LEFT JOIN
(
SELECT *
FROM Person
WHERE Person.Status != "CANCELLED"
) Person
ON House.ID = Person.HouseID
...有效,但会破坏所有索引。有没有更好的解决方案?
我正在使用 MySQL,所有相关列都已编入索引。 EXPLAIN 在possible_keys 中没有列出任何内容。
谢谢。
【问题讨论】:
标签: sql mysql optimization subquery left-join