我在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)
                 );

08-07 14:21