mysql - SQL查询以查找每个人都超过特定年龄的所有房屋

标签 mysql sql

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

关于mysql - SQL查询以查找每个人都超过特定年龄的所有房屋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36192545/

相关文章:

sql - 在Django中,如何在字段上对模型进行排序,然后获取最后一个项目?

sql - 相关子查询如何与 Exists 运算符一起使用?

java - 将 SQL 查询转换为 JOOQ

java - 使用查询更新对象外键

mysql - 在一列中使用 和 选择多个

c# - 如何根据 SQL 行中的值创建正确的子类

sql - 对于这种情况,是否存在单个自联接?

mysql - 将 CSV 导入 MySQL,在行尾留下引号

mysql - MySQL中的ORDER BY日期,收到错误

sql - 将现有表数据迁移到新表,并根据查询结果更改列值到其他表