abfrage mit mehreren Bedingungen

  • zwei Tabellen: einmal dog mit id, gender, born, breeder_id, owner_id - und owner mit id, zwingername

    die id aus der Tabelle owner kann in der Tabelle dog in den Feldern owner_id und/oder breeder_id auftauchen
    z.B. stehe ich in der owner mit der id 5 drin, in der dog sind
    Hund A mit der breeder_id 5 und owner_id 8 => ich hab den Hund gezüchtet, aber Besitzer ist ein anderer
    Hund B mit der breeder_id 7 und owner_id 5 => ein anderer hat den Hund gezüchtet, aber Besitzer bin ich
    Hund C mit der breeder_id 5 und owner_id 5 => ich hab den Hund gezüchtet und Besitzer bin ich auch

    Ich möchte abfragen welche Zwingernamen noch niemals Nachwuchs hatten (wo also keine Einträge bei der breeder_id sind):

    PHP
    SELECT kennelname, country, country_short, kennel_note, id  FROM owner 
    
    
    WHERE owner.id NOT IN (SELECT breeder_id FROM dog)

    damit erhalte ich aber auch die von vor 20 Jahren, ergo muss (möchte) ich auch noch sagen
    wo Tabelle owner.id = Tabelle dog.owner_id und dog=gender female und nicht älter als x Jahre

    d.h. es sollen mir letztendlich nur die angezeigt werden, die auch noch eine mögliche Hündin zum züchten zur Verfügung haben
    aber die query krieg ich nicht auf die Reihe ...

  • Beispiel:

    SQL
    SELECT kennelname, country, country_short, kennel_note, id  FROM owner 
    
    
    WHERE owner.id NOT IN (SELECT breeder_id FROM dog WHERE born > DATE_SUB(NOW(), INTERVAL 10 year)
  • das schmeißt mir einen error: ...right syntax to use near '' at line...

    Mit ein wenig querdenken hab ich das jetzt so gelöst:

    SQL
    SELECT dog.id AS dogid, dog.breeder_id, dog.date_of_birth, dog.gender, dog.owner_id, owner.id, owner.kennelname, owner.country, owner.country_short, owner.kennel_note
    FROM dog
    INNER JOIN owner ON dog.owner_id = owner.id 
    WHERE dog.owner_id = owner.id 
    AND dog.gender='female' 
    AND dog.date_of_birth >= DATE_SUB(CURDATE(), INTERVAL 9 YEAR)
    AND owner.kennelname !=''
    AND owner.kennel_note =''
    AND owner.id NOT IN (SELECT breeder_id FROM dog)

    aber das dauert ein wenig zu lang ....

  • Das dauert auch so lang, weil Du mit dem Subselect vermutlich auf eine große Tabelle zugreifst. Schau dir mal explain zu dem Statement an (siehe Manual ;) ) und setze evtl. noch einen Index auf alle Integer-Spalten, wenn es den nicht schon gibt.