2016-03-24 9 views
1

Ich habe eine Tabelle in MySQL, um Mitglieder eines Haushalts zu speichern. Es sieht wie folgt ausSQL-Abfrage, um alle Häuser zu finden, in denen alle über einem bestimmten Alter sind

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

Es hat viele zu einer Assoziation mit den Haushalt Tabellen.

Beispieldaten könnten sein:

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

Etc... 

Was ist die effizienteste Abfrage alle den Haushalt zu finden, wo alle Mitglieder über ein bestimmtes Alter sind?

Danke!

+0

Oder ist dies nicht der richtige Weg, um meine Daten zu speichern? –

+1

Ich gehe eher davon aus, dass der Tabellenname 'Hausmitglieder' ist und die' Hausid' die Kennung "Haushalt" enthält. –

+0

Ja. Stimmt! –

Antwort

4

Eine Methode ist die Aggregation:

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

Ein anderes Verfahren verwendet not in/not exists aber erfordert Deduplizierung:

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

Dies ist wahrscheinlich nicht effizienter als die erste Version. Aber, wenn Sie eine houses Tabelle (eine Zeile pro houseid) und die richtigen Indizes haben, dies sollte schneller sein:

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

sollte es maximal() statt min() sein, da du möchtest, dass der Jüngste vor einer bestimmten Zeit ist? –

+1

@TinTran. . .Ja Dankeschön. Ich habe über das Alter nachgedacht, als ich das schrieb. Geburtsdatum geht in die andere Richtung. –

+1

ja ich war mir nicht sicher, hehe –

Verwandte Themen