我在MySQL中有一个表来存储家庭成员。看起来像这样
CREATE TABLE housembers (
id int,
houseid int,
housemberid int,
year_of_birth int
);
它与家庭餐桌有多对一的联系。
示例数据可能是:
1, 1, 1, 1980
2, 1, 2, 1977
3, 2, 1, 1969
4, 3, 1, 1950
Etc...
什么是最有效的查询,以找到所有家庭成员都超过一定年龄?
谢谢!
最佳答案
一种方法是聚合:
select houseid
from housemembers
group by houseid
having max(year_of_birth) < date_sub(curdate(), interval @age years);
另一种方法使用
not in
/not exists
但需要重复数据消除:select distinct houseid
from housemembers hm
where not exists (select 1
from housemembers hm2
where hm2.houseid = hm.houseid and
year_of_birth >= date_sub(curdate(), interval @age years)
);
这可能不会比第一个版本更有效。但是,如果您有一个
houses
表(每houseid
一行)和正确的索引,则应该更快:select houseid
from houses h
where not exists (select 1
from housemembers hm2
where hm2.houseid = h.houseid and
year_of_birth >= date_sub(curdate(), interval @age years)
);