Tino: Select für gleiche Inhalte

hallo
Ich möchte in einer Datenbank all jene Einträge aufrufen, die für einen bestimmten User in einer Spalte gleiche Inhalte haben. - quasi das Gegenteil von Distinct.
Beispiel:

ID Name Nummer
01 Hans 1
02 Klaus 1
03 Erna 1
04 Hans 1      <---
05 Hans 2
06 Klaus 2
07 Erna 2

als Ergebnis brauche ich dann die Zeilen 01 und 04

Also etwa :
SELECT * FROM tab WHERE Name = "Hans" AND doppelt

das Ende ist natürlich Quatsch! - wie mache ich das?

danke

  1. hallo

    das Ende ist natürlich Quatsch! - wie mache ich das?

    Du meinst Pseudocode ;-)

    Also mach Dich mal über GROUP BY und COUNT schlau. So in etwa: Abfrage gruppieren und die gruppierten Records zählen und dann die ausgeben wo mehr als oiner.

    Gruss, Rolf

    --
    Heute ist Freitag. Ganz einfach.
    1. Hallo Rolf!

      Also mach Dich mal über GROUP BY und COUNT schlau. So in etwa:
      Abfrage gruppieren und die gruppierten Records zählen und dann
      die ausgeben wo mehr als oiner.

      Er will alle Einträge der Doppelten. Bei deinem Ansatz würde er _nur_ _eine_ ID der IDs/Einträge mit doppelten Namen und Nummer

      Tino will also aus seiner angegebenen Tabelle folgende Einträge erhalten, wenn ich ihn richtig verstanden habe.

      ID | Name | Nummer
         ------------------
         01 | Hans |      1
         04 | Hans |      1

      Bei deinem Ansatz würder er nur einen von beiden Datensätzen als Ergebnis erhalten.

      1. hi,

        Also mach Dich mal über GROUP BY und COUNT schlau. So in etwa:
        Abfrage gruppieren und die gruppierten Records zählen und dann
        die ausgeben wo mehr als oiner.

        Er will alle Einträge der Doppelten. Bei deinem Ansatz würde er _nur_ _eine_ ID der IDs/Einträge mit doppelten Namen und Nummer

        Stimmt! Wir ändern das Select so, dass alle gruppierten Records ausgegeben werden wo COUNT den Wert 2 ergibt. Und schon gehts ;-)

        Gruss, Rolf

        1. Hallo Rolf!

          Also mach Dich mal über GROUP BY und COUNT schlau. So in etwa:
          Abfrage gruppieren und die gruppierten Records zählen und dann
          die ausgeben wo mehr als oiner.

          Er will alle Einträge der Doppelten. Bei deinem Ansatz würde
          er _nur_ _eine_ ID der IDs/Einträge mit doppelten Namen und Nummer

          Stimmt! Wir ändern das Select so, dass alle gruppierten Records
          ausgegeben werden wo COUNT den Wert 2 ergibt. Und schon gehts ;-)

          Nein. Es gibt folgende Spalten: ID, Name und Nummer. Deine Lösung sehe wohl ansatzweise wie folgt aus:

          SELECT COUNT(*) AS 'Anzahl'
               FROM Tabelle
              WHERE Tabelle.Name = 'Hans'
                AND ?
              GROUP BY Tabelle.Name
             HAVING Anzahl = 2;

          Und dann bzw. für "?"?... Oder verstehe ich dich falsch?

          Meiner Meinung nach, kommt nur ein "self join" in Frage, wie ich es bereits in meinem vorherigen Posting beschrieben habe. Vielleicht ist das aber auch falsch?

  2. Hallo Tino!

    Ein "self join" könnte deine Lösung sein (Zumindest bei MySQL):

    SELECT A.ID
        FROM Tabelle A, Tabelle B
       WHERE A.ID != B.ID
         AND A.Nummer = B.Nummer
         AND A.Name = B.Name
         AND A.Name = 'Hans'
       GROUP BY A.ID;

    Ich hoffe, ich habe kein Denkfehler. Ob es so funktioniert, kann ich dir leider nicht garantieren.

    PS.: Als Prävention vor Doppeleinträge, setze einen UNIQUE-Index
         über beide Spalten (Name und Nummer).

    1. Besten Dank!
      hat funktioniert.

      habe die tabelle kopiert und dann das angepasste select durchgeführt.
      Das Problem hat sich ganz am anfang durch meine Ahnungslosigkeit eingeschlichen. - User konnten einträge doppelt machen wenn nicht aufgepasst wurde. Das kann ich natürlich schon vorher abfangen.
      Aber es waren natürlich einige doppelte Einträge vorhanden.

      also nochmals vielen Dank
      Tino

      1. habe die tabelle kopiert und dann das angepasste select
        durchgeführt.

        Wieso hast du die Tabelle kopiert? Du hast es dir wahrscheinlich umständlicher gemacht, als nötig bzw. mein Posting falsch verstanden.

        Kopieren der Tabelle wäre nämlich nicht nötig gewesen, da meine SQL-Query die Tabelle mit _sich_ _selbst_ verknüpft. Dies nennt man "self join".

        Wenn du die Tabelle kopierst und dann beide Tabellen miteinander verknüpfst, ist es ein normaler "Join".

        Aber Hauptsache, es hat funktioniert! ;-)