2017-11-10 1 views
0

Dies könnte eine relativ einfache Frage sein, aber ich habe Mühe, es auszuarbeiten. Ich habe drei Tabellen alle unten aufgeführt (owners, pets, petTypes) und versuchen, die folgenden Daten alle in einer Abfrage zu extrahieren. Die ersten beiden sind nicht schwer, aber die 3. und 4. ist wo ich kämpfe.Wählen Sie MAX-Wert aus der Spalte und den entsprechenden Wert aus einem anderen

Tabellendaten, wenn Sie möchten, replizieren: https://pastebin.com/veXHwcMc

Die Fragen:

  • Owners älteste Haustier Alter
  • Owners älteste Haustier

    1. Besitzer Id

    2. Name des Inhabers Geben Sie den Namen

    3. ein
    4. Anzahl der andere Haustiere

    Was ich

    Auswahl des ältesten Alters SELECT MAX(age) FROM pets

    die Tabellen versucht haben, Zusammenschieben der beiden SELECT pets.ownerId, MAX(pets.age), petTypes.name FROM pets INNER JOIN petTypes ON pets.petTypeId = petTypes.id GROUP BY pets.ownerId;

    zu zeigen, aber das ist falsch. Weil sie alle Katze zeigen, wenn sie den korrekten Namen für die älteste Katze zeigen sollten.

    ich cam auf diese Frage: How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

    So versuchte ich: SELECT petTypes.id, petTypes.name FROM petTypes INNER JOIN (SELECT MAX(age) FROM pets GROUP BY ownerId) pets ON petTypes.id = pets.petTypeId;

    Aber die geworfen Fehler ist ERROR 1054 (42S22): Unknown column 'petTypes.id' in 'on clause'

    Jede Hilfe bitte

    tables + the data

  • +0

    Können Sie einen Datensatz mit dem ältesten Haustieralter für jeden Besitzer erhalten? Kannst du das dann verwenden, um die Daten zu verknüpfen, um die Ergebnisse dessen, was Haustiere angezeigt werden, zu begrenzen, indem du dem Besitzer und dem Alter des Tieres beitrittst? Was passiert, wenn mehrere Tiere gleich alt sind? Willst du alle oder nur 1? Wie bestimmst du welchen? – xQbert

    +0

    Ich versuche, das älteste Haustier UND Namen zu finden. Wenn der Besitzer mehrere hat, die das gleiche Alter haben, brauche ich nur eine (eine) – Nouman

    +0

    Wenn Sie immer noch kämpfen, finden Sie unter: [Warum sollte ich eine MCVE für eine, wie mir scheint, sehr einfache SQL-Abfrage bieten ?] (https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql -Abfrage) – Strawberry

    Antwort

    0

    Working demo:

    SELECT O.ID, O.FirstName, O.LastName, P.Age, min(PT.Name) as TypeName, OPets.CntOfOtherPets 
    FROM Owners O 
    INNER JOIN (SELECT OwnerID, max(Age) MA, count(*)-1 as CntOfOtherPets 
          FROM Pets 
          GROUP BY OwnerID) OPets 
    on OPets.OwnerID = O.ID 
    INNER JOIN Pets P 
    on P.Age = OPets.MA 
    and P.OwnerID = OPets.OwnerID 
    INNER JOIN PetTypes PT 
    on P.PetTypeID = PT.ID 
    GROUP BY O.ID, O.FirstName, O.LastName, P.Age, OPets.CntOfOtherPets ; 
    

    Die abgeleitete Tabelle OPets bekommt eine Zählung aller Haustiere von Besitzer weniger 1, da wir wissen, dass dies die Zahl "anderes Haustier" darstellt. Das maximale Tieralter wird über den gruppierten Eigentümer zurückgegeben. Wenn wir diesen Datensatz zum Haustier-Set hinzufügen, erhalten wir nur die Haustiere für diesen Besitzer mit dem maximalen Alter. Wir schließen uns dann petType an, um den Namen dieses Haustiers zu erhalten (oder Haustiere, wenn mehrere dasselbe Alter teilen).

    Schließlich gruppieren Sie nach allen Feldern außer PT.Name, und wählen Sie die min (PetType.Name). Auf diese Weise wählen wir, wenn mehrere Tiere mit dem gleichen Alter existieren, denjenigen mit TypeName mit dem frühesten Namen alphabetisch. Dieser Ansatz funktioniert nur, wenn die Daten zurückgegeben werden. Wenn ein Haustiername oder die Haustier-ID zurückgegeben werden muss, wäre ein anderer Ansatz erforderlich; aber das war bei weitem die einfachste Lösung angesichts der gewünschten Ergebnisse (Spalten zurückgegeben)

    Die count-1 scheint ein wenig hackish, da count (*) gibt eine Zählung aller Haustiere -1 subtrahiert einfach die 1 wir wissen wir hatten für die # 5-Anforderung: Anzahl der andere Haustiere. Selbst im Falle von Altersbindung wird diese # korrekt sein.Da count-1 wird immer die "anderen Haustiere"

    +0

    Vielen Dank für eine so lange Antwort und erklären, was Sie getan haben, aber leider, Fehler 1054 (42S22): Unbekannte Spalte 'Opets.CntOfOtherPets' in 'Feldliste'. Ich nahm an, "CntOfOtherPEts" wurde versehentlich mit cappedCtOfOtherPets versehen, aber es hat den Fehler – Nouman

    +0

    nicht behoben Ich kann nicht sehen, was falsch ist. Ich muss die Tabellen/Daten nachbilden. Ich habe ein "as" hinzugefügt und die Konsistenz der Rechtschreibung sichergestellt. aber ich weiß nicht, ob das das Problem gelöst hat. – xQbert

    +0

    Die Tabelle Daten hinzugefügt, wenn Sie es testen möchten: https://pastebin.com/veXHwcMc – Nouman

    0

    sollte dies funktionieren, kann es nicht testen, aber wenn Besitzer zwei oder mehr Haustiere gleichen Alters hat, wird es mehrere Datensätze zeigen.

    Select ow.Firstname, ow.lastname ,petinfo.Age, petinfo.Name, petcount.TotalPets 
        from #owners ow 
        join (Select age, p.petTypeId, p.OwnerID, pt.name From 
           (select max(age) as age, petTypeId, OwnerID 
           from #pets p 
           Group by OwnerID,petTypeId 
           ) p 
          Join #petTypes pt on pt.ID = p.petTypeId 
          ) petinfo 
          on petinfo.OwnerID = ow.id 
        Join (
          Select Count(*) TotalPets, ownerID 
          From #Pets 
          group by OwnerID 
         ) petcount 
         on petcount.ownerID = ow.ID 
    
    +0

    Unbekannte Spalte 'Alter 'in' Feldliste '. Außerdem beginnen alle Tabellennamen in Kleinbuchstaben, daher habe ich sie gegebenenfalls geändert. Nicht sicher, aus welcher Tabelle TypeId stammt? – Nouman

    Verwandte Themen