Datensätze bei denen COUNT(x) > y auswählen

  • SQL

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Schmittmuthelm.

    Datensätze bei denen COUNT(x) > y auswählen

    Ich versuche mich gerade etwas an SQL und nutze dafür MySQL mit der enthaltenen Workbench.
    Ich habe eine Tabelle personen mit folgenden Datensätzen:
    id
    vorname
    nachname
    strasse
    hausnummer
    ort
    1
    Ingo
    Lessig
    Ingo Strasse
    15
    Frankfurt
    2
    Max
    Mustermann
    Hauptstrasse
    11
    Fulda
    3
    Berbel
    Berlauch
    Friedensweg
    7
    Kassel
    4
    Heiko
    Lessig
    Ingo Strasse
    15
    Frankfurt
    5
    Thomas
    Müller
    August Strasse
    7
    München
    6
    Anke
    Lessig
    Bodenweg
    105
    Oberhof
    7
    Manfred
    Mustermann
    Audiweg
    24
    Ingolstadt
    8
    Marcus
    Müller
    Hauptstrasse
    1
    Berlin
    9
    Karl
    Abe
    Am Marktplatz
    36
    Halle
    10
    Franz
    Mustermann
    Leipziger Str.
    17
    Offenbach

    Nun möchte ich aus dieser Tabelle die Werte für `nachname`, `vorname`und `ort`für die Personen haben, bei denen der Nachname in der Tabelle mehr als zwei mal vorkommt.

    Mit dem Befehl

    SQL-Abfrage

    1. SELECT nachname, vorname, ort FROM personen
    2. GROUP BY nachname HAVING COUNT(nachname) > 2
    3. ORDER BY nachname, vorname;
    bekomme ich zwar nur die entsprechenden Nachnamen (Lessig, Mustermann) angezeigt, aber eben nur mit jeweils einer Zeile.

    Ich hätte als Ergebnismenge gerne
    nachname
    vorname
    ort
    Lessig
    Anke
    Oberhof
    Lessig
    Heiko
    Frankfurt
    Lessig
    Ingo
    Frankfurt
    Mustermann
    Franz
    Offenbach
    Mustermann
    Manfred
    Ingolstadt
    Mustermann
    Max
    Fulda

    Allerdings scheitere ich an dem Befehl dafür ?(

    *Topic verschoben*
    Dumm ist der, der dumm ist. Nicht andersrum!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    habe das hier in Access probiert und es funktioniert

    SQL-Abfrage

    1. SELECT Personal.Vorname, Personal.Nachname, Personal.Ort
    2. FROM Personal
    3. WHERE ((( Personal.Nachname) In (SELECT [Nachname] FROM [Personal] As Tmp
    4. GROUP BY [Vorname],[Nachname]
    5. HAVING Count(*)>1 And
    6. [Nachname] = [Personal].[Nachname])));
    @Kasi
    Bei stackoverflow habe ich gelesen, dass man in MySQL Backticks ` anstatt der eckigen Klammern verwendet.
    Wenn ich das dann so anpasse sieht die Abfrage so aus

    SQL-Abfrage

    1. SELECT personen.vorname, personen.nachname, personen.ort
    2. FROM personen
    3. WHERE ((( personen.nachname) In (SELECT `nachname` FROM `personen` As Tmp
    4. GROUP BY `vorname`,`nachname`
    5. HAVING Count(*) > 2 And
    6. `nachname` = `personen`.`nachname`)));


    Allerdings habe ich dann keine Ergebnismenge (0 Rows returned).

    Kann man die Klammern nicht so einfach durch Backticks ersetzen oder mache ich noch was falsch?
    Dumm ist der, der dumm ist. Nicht andersrum!
    Backticks sind keine Pflicht, sondern erlauben es einem nur, geschützte Bezeichner und evtl. ungültige Zeichenfolgen für z. B. Tabellen- und Feldnamen zu verwenden. Zudem kann man dadurch u. U. SQL-Injections verhindern, da klar ist, was ein Name ist.

    Aber zum Problem, wie wäre es damit (ungetestet)?

    SQL-Abfrage

    1. SELECT p1.nachname, p1.vorname, p1.ort
    2. FROM personen p1
    3. WHERE (SELECT COUNT(*) FROM personen p2 WHERE p2.nachname = p1.nachname) > 2
    4. ORDER BY p1.nachname, p1.vorname;

    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Jou das funzt.

    Hatte es mittlerweile selbst etwas anders gelöst

    SQL-Abfrage

    1. SELECT nachname, vorname, ort FROM personen WHERE nachname IN (
    2. SELECT nachname FROM personen
    3. GROUP BY nachname HAVING COUNT(nachname) > 2)
    4. ORDER BY nachname, vorname;


    Der Telefonjoker eines Kollegen hatte noch eine andere Lösung

    SQL-Abfrage

    1. SELECT nachname, vorname, ort FROM personen p1 WHERE EXISTS (
    2. SELECT nachname FROM personen p2 where p1.nachname = p2.nachname GROUP BY nachname HAVING COUNT(nachname) > 2)
    3. ORDER BY nachname, vorname;

    Diese Variante soll wohl bei großen Datenmengen in der Tabelle performanter sein, was ich aufgrund mangelnder Kenntnis nicht bestätigen kann. wollte die Variante hier nur als weitere Lösung unterbringen.

    Vielen Dank an alle.

    Dumm ist der, der dumm ist. Nicht andersrum!