2016-03-24 4 views
1

私は家計のメンバーを保存するためにMySQLにテーブルを持っています。それはこのように見える誰もが特定の年齢以上のすべての家を見つけるためのSQLクエリ

CREATE TABLE housembers (
    id int, 
    houseid int, 
    housemberid int, 
    year_of_birth int 
); 

これは世帯テーブルとの関連が1対多です。

例のデータは次のようになります。

1, 1, 1, 1980 
2, 1, 2, 1977 
3, 2, 1, 1969 
4, 3, 1, 1950 

Etc... 

すべてのメンバーが一定の年齢を超えているすべての家庭を見つけるための最も効率的なクエリとは何ですか?

ありがとうございます!

+0

それともこれが私のデータを格納するための正しい方法ではないでしょうか? –

+1

テーブル名は 'housemembers'と仮定し、' houseid'は "世帯"識別子を含んでいます。 –

+0

はい。そのとおり! –

答えて

4

一つの方法は、集合体である:

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ごとに1行)と右のインデックスを持っている場合しかし、これは速くする必要があります:

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) 
       ); 
+2

これはmin()の代わりにmax()でなければなりません。 –

+1

@TinTran。 。 。はい、ありがとうございます。私はそれを書いていた時代を考えていました。生年月日は別の方向に向かいます。 –

+1

ええ私はheheのいずれかがわからなかった –

関連する問題