2016-03-24 14 views
1

Bir hane halkının üyelerini saklamak için MySQL'de bir masa var. Görünüşe göre bu, ev tabloları ile bire bir ilişki vardır.Herkesin belirli bir yaşın üstünde olduğu tüm evleri bulmak için SQL sorgusu

Örnek veri olabilir:

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

Etc... 

tüm üyeler belirli bir yaşın üzerinde olan tüm ev bulmak için en verimli sorgu nedir

?

Teşekkürler!

select houseid 
from housemembers 
group by houseid 
having max(year_of_birth) < date_sub(curdate(), interval @age years); 

bir başka yöntem not in/not exists kullanır, ancak tekilleştirme gerektirir:

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

Bu ilk sürümü daha fazla verimli muhtemelen

+0

Yoksa bu veri depolamak için doğru yol değil mi? –

+1

Tablo isminin “ev sahipleri” olduğunu ve “ev” nin “hane” tanımlayıcısını içerdiğini düşünmekteyim. –

+0

Evet. Doğru! –

cevap

4

bir yöntem toplamıdır. Bir houses tablo (houseid başına bir satır) ve sağ dizin varsa Ama, bu daha hızlı olmalı edilir:

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() yerine min() yerine en küçük olanın belirli bir süre önce olmasını istemeniz gerekir mi? –

+1

@TinTran. . .Evet teşekkür ederim. Yazarken yaşı düşünüyordum. Doğum tarihi diğer yöne gider. –

+1

Evet, ya –

İlgili konular