Daniel82: Tabellenfelder vergleichen

Tabelle: Nutzer

Felder: ID, Name, Vorname, Ort, Telefon, eMail

Beispieldaten:

1, Meier, Daniel, Homburg, 1234, md@mail.de
2, Werner, Thorben, München, 4321, wt@mail.de
3, Kind, Thomas, Dortmund, 3242, kt@mail.de
4, Winter, Daniel, Bremen, 7823, wd@mail.de
5, Winter, Marina, Wilhelmshaven, 3465, wm@mail.de
6, Albert, Tim, Leipzig, 5231, at@mail.de
7, Albert, Tim, Leipzig, 5231, at2@mail.de

SQL-Abfrage:

  • Name prüfen
    $sql = "select count(*), Name, Vorname, Ort, Telefon, eMail from Nutzer group by Name having count(*) > 1";

  • Vorname prüfen
    $sql = "select count(*), Name, Vorname, Ort, Telefon, eMail from Nutzer group by Vorname having count(*) > 1";

Problem:
1.) Beide SQL-Anweisungen bringen bei "count()" eine 2, dennoch wird nur ein Datensatz angezeigt. Wo ist mein Fehler, wie kann ich das beheben?
2.) ID 6 und 7 sind Name und Vorname gleich. Wie lautet so eine SQL-Anweisung, wenn ich Name und Vorname auf Gleichheit prüfen will?

  1. Hallo Daniel,

    Du hast zwar das verwendete Datenbankmanagementsystem nicht angegeben und eine Deiner letzten Anfragen bezog sich auf Oracle, aber

    Tabelle: Nutzer

    Felder: ID, Name, Vorname, Ort, Telefon, eMail

    Beispieldaten:

    1, Meier, Daniel, Homburg, 1234, md@mail.de
    2, Werner, Thorben, München, 4321, wt@mail.de
    3, Kind, Thomas, Dortmund, 3242, kt@mail.de
    4, Winter, Daniel, Bremen, 7823, wd@mail.de
    5, Winter, Marina, Wilhelmshaven, 3465, wm@mail.de
    6, Albert, Tim, Leipzig, 5231, at@mail.de
    7, Albert, Tim, Leipzig, 5231, at2@mail.de

    sowas wie die nächsten beiden Statements:

    $sql = "select count(*), Name, Vorname, Ort, Telefon, eMail from Nutzer group by Name having count(*) > 1";

    $sql = "select count(*), Name, Vorname, Ort, Telefon, eMail from Nutzer group by Vorname having count(*) > 1";

    akzeptiert außer MySQL kein mir bekanntes Datenbankmanagementsystem. Alle anderen weisen diese Abfragen als syntaktisch falsch zurück, weil Du nicht nach allen Spalten, die _keine_ Aggregatsfunktion enthalten gruppiert hast.

    1.) Beide SQL-Anweisungen bringen bei "count()" eine 2, dennoch wird nur ein Datensatz angezeigt. Wo ist mein Fehler, wie kann ich das beheben?

    Was bitte wäre Dein gewünschtes Ergebnis?

    Erste Abfrage, Prüfung auf doppelte Familiennamen:

    SELECT  
        Name,  
        COUNT(*)  
    FROM Nutzer  
    GROUP BY Name  
    HAVING COUNT(*) > 1
    

    sollte zwei Datensätze zurückliefern:

    Name    COUNT(*)
    ----------------
    Winter  2
    Albert  2

    2.) ID 6 und 7 sind Name und Vorname gleich. Wie lautet so eine SQL-Anweisung, wenn ich Name und Vorname auf Gleichheit prüfen will?

    SELECT  
        Name,  
        Vorname,  
        COUNT(*)  
    FROM Nutzer  
    GROUP BY  
        Name,  
        Vorname  
    HAVING COUNT(*) > 1
    

    liefert die Datensätze

    Name   Vorname COUNT(*)
    ----------------------
    Albert Tim     2

    Es ist überhaupt keine gute Idee, Spalten mitzunehmen, nach denen man _nicht_ gruppiert (oder gar nicht gruppieren kann):

    Verwendet man kein MySQL, so erhält man ziemlich sicher eine Fehlermeldung
    Verwendet man MySQL - und der Inhalt dieser Spalten ist bei den einzelnen Datensätzen unterschiedlich, so erhält man zufällige Ergebnisse in diesen Spalten.

    Möchtest Du etwa alle Daten aller Nutzer haben, deren Name mehr als einmal vorkommt? Dann sage dies bitte auch. Es ist eine sehr gute Idee, die gewünschte Ergebnismenge anzugeben - am besten mit einer Klartextbegründung, warum man genau diese Datensätze haben möchte, z.B:

    Gewünschtes Ergebnis:

    4, Winter, Daniel, Bremen, 7823, wd@mail.de
    5, Winter, Marina, Wilhelmshaven, 3465, wm@mail.de
    6, Albert, Tim, Leipzig, 5231, at@mail.de
    7, Albert, Tim, Leipzig, 5231, at2@mail.de

    weil die Familennamen "Winter" und "Albert" doppelt vorkommen.

    Freundliche Grüße und mit der Bitte um eine konkretere Problembeschreibung

    Vinzenz

    1. Hallo Daniel,

      Du hast zwar das verwendete Datenbankmanagementsystem nicht angegeben und eine Deiner letzten Anfragen bezog sich auf Oracle, aber

      Nutze MySQL!

      Erste Abfrage, Prüfung auf doppelte Familiennamen:

      SELECT

      Name,
          COUNT()
      FROM Nutzer
      GROUP BY Name
      HAVING COUNT(
      ) > 1

      
      >   
      > sollte zwei Datensätze zurückliefern:  
      >   
      > Name    COUNT(\*)  
      > ----------------  
      > Winter  2  
      > Albert  2  
        
      Leider nicht. Bei mir steht nur "Winter" und dahinter eine "2"!  
        
      
      > Es ist überhaupt keine gute Idee, Spalten mitzunehmen, nach denen man \_nicht\_ gruppiert (oder gar nicht gruppieren kann):  
      >   
      > Verwendet man kein MySQL, so erhält man ziemlich sicher eine Fehlermeldung  
      > Verwendet man MySQL - und der Inhalt dieser Spalten ist bei den einzelnen Datensätzen unterschiedlich, so erhält man zufällige Ergebnisse in diesen Spalten.  
      >   
      > Möchtest Du etwa alle Daten aller Nutzer haben, deren Name mehr als einmal vorkommt? Dann sage dies bitte auch. Es ist eine sehr gute Idee, die gewünschte Ergebnismenge anzugeben - am besten mit einer Klartextbegründung, warum man genau diese Datensätze haben möchte  
        
      Ja, ich will gerne weitere bzw. momentan alle Daten von dem Nutzer haben, deren Name/Vorname gleich ist.
      
      1. Erste Abfrage, Prüfung auf doppelte Familiennamen:

        SELECT

        Name,
            COUNT()
        FROM Nutzer
        GROUP BY Name
        HAVING COUNT(
        ) > 1

        
        > >   
        > > sollte zwei Datensätze zurückliefern:  
        > >   
        > > Name    COUNT(\*)  
        > > ----------------  
        > > Winter  2  
        > > Albert  2  
        >   
        > Leider nicht. Bei mir steht nur "Winter" und dahinter eine "2"!  
        >   
          
        Hattest doch recht. Hatte mich in deinem Posting verlesen!
        
      2. Hallo Daniel,

        Beispieldaten:

        ID  Name    Vorname  Ort            Telefon  eMail
        ------------------------------------------------------------
        1   Meier   Daniel   Homburg        1234     md@example.org
        2   Werner  Thorben  München        4321     wt@example.org
        3   Kind    Thomas   Dortmund       3242     kt@example.org
        4   Winter  Daniel   Bremen         7823     wd@example.org
        5   Winter  Marina   Wilhelmshaven  3465     wm@example.org
        6   Albert  Tim      Leipzig        5231     at@example.org
        7   Albert  Tim      Leipzig        5231     at2@example.org

        Anmerkung: Für Beispieldaten sind die Domains

        example.org, example.com, example.net

        vorgesehen. Es wäre eine gute Idee, in Zukunft bei Beispieldaten
        diese zu verwenden.

        SELECT

        Name,
            COUNT()
        FROM Nutzer
        GROUP BY Name
        HAVING COUNT(
        ) > 1

        
        > >   
        > > sollte zwei Datensätze zurückliefern:  
        > >   
        > > Name    COUNT(\*)  
        > > ----------------  
        > > Winter  2  
        > > Albert  2  
          
        
        > Ja, ich will gerne weitere bzw. momentan alle Daten von dem Nutzer haben, deren Name/Vorname gleich ist.  
          
        Du möchtest also die Details zu diesen Nutzern haben. Das geht mit einer [korrelierten Unterabfrage](http://dev.mysql.com/doc/refman/4.1/en/correlated-subqueries.html). MySQL unterstützt Unterabfragen ab Version 4.1.  
          
        ~~~sql
        SELECT  
            ID,                   -- Liste der gewünschten Details  
            Name,  
            Vorname,  
            Ort,  
            Telefon,  
            eMail  
        FROM Nutzer  
        WHERE Name IN (           -- von den Datensätzen, bei denen der Name  
            SELECT                -- in der Liste  
                Name              -- der Namen  
            FROM Nutzer           -- der Nutzer vorkommt,  
            GROUP BY Name  
            HAVING COUNT(*) > 1   -- die häufiger als einmal vorkommen  
        )
        

        liefert mit den Beispieldaten als Ergebnis

        ID  Name    Vorname  Ort            Telefon  eMail
        ------------------------------------------------------------
        4   Winter  Daniel   Bremen         7823     wd@example.org
        5   Winter  Marina   Wilhelmshaven  3465     wm@example.org
        6   Albert  Tim      Leipzig        5231     at@example.org
        7   Albert  Tim      Leipzig        5231     at2@example.org

        wobei die Datensätze in einer zufälligen Reihenfolge auftreten können, da keine Sortierung vorgegeben ist.
        Getestet mit MySQL 4.1.18 und MS SQL-Server 2005.

        Grundsätzlich empfehle ich Dir, Dich in SQL einzuarbeiten, damit Du auch verstehst, was Du machst. Die Lektüre der Handbücher des gerade verwendeten Datenbankmanagementsystems ist dabei durchaus lehr- und hilfreich.

        Freundliche Grüße

        Vinzenz

        1. Super super. Genau das meinte ich und es funktioniert!

          Danke!!!

        2.   
          SELECT  
           ID,                   -- Liste der gewünschten Details  
           Name,  
           Vorname,  
           Ort,  
           Telefon,  
           eMail  
          FROM  
           Nutzer  
          WHERE  
           Name IN  
            (                    -- von den Datensätzen, bei denen der Name  
            SELECT               -- in der Liste  
             Name                -- der Namen  
            FROM  
             Nutzer              -- der Nutzer vorkommt,  
            GROUP BY  
             Name  
            HAVING  
             (COUNT(*) > 1)      -- die häufiger als einmal vorkommen  
            )  
          
          

          So, so, auch noch getestet.

          Weihnachtsmann!   ;)

  2. Die Anforderung muss immer möglichst präzise beschrieben sein. Daran mangelt es bei dieser Problemfrage.

    Wenn es angefordert sein sollte Dubletten an Hand bestimmter Kriterien zu identifizieren, dann könnte mit Unterabfragen gearbeitet werden, bspw. mit einem GROUP BY und HAVING in der Unterabfrage die Dublettenkriterien bündeln und in der Hauptabfrage diese Kriterien in einem WHERE referenzieren. Dann kämen die Kandidaten für die möglicherweise angestrebte "manuelle" Behandlung hoch.

    "Möglicherweise" - wir sehen also, dass irgendetwas fehlt bei der (scheinbaren?) Problemfrage, die vielleicht folgende Konzeptfrage ist: Dubletten killen, wie geht das?

    1. Die Anforderung muss immer möglichst präzise beschrieben sein. Daran mangelt es bei dieser Problemfrage.

      Wenn es angefordert sein sollte Dubletten an Hand bestimmter Kriterien zu identifizieren, dann könnte mit Unterabfragen gearbeitet werden, bspw. mit einem GROUP BY und HAVING in der Unterabfrage die Dublettenkriterien bündeln und in der Hauptabfrage diese Kriterien in einem WHERE referenzieren. Dann kämen die Kandidaten für die möglicherweise angestrebte "manuelle" Behandlung hoch.

      "Möglicherweise" - wir sehen also, dass irgendetwas fehlt bei der (scheinbaren?) Problemfrage, die vielleicht folgende Konzeptfrage ist: Dubletten killen, wie geht das?

      Habe meine Frage genauer gestellt in einem weiteren Eintrag in diesem Thread!

      1. "Möglicherweise" - wir sehen also, dass irgendetwas fehlt bei der (scheinbaren?) Problemfrage, die vielleicht folgende Konzeptfrage ist: Dubletten killen, wie geht das?

        Habe meine Frage genauer gestellt in einem weiteren Eintrag in diesem Thread!

        Meinst Du "Ja, ich will gerne weitere bzw. momentan alle Daten von dem Nutzer haben, deren Name/Vorname gleich ist." aus https://forum.selfhtml.org/?t=144412&m=937169 ?

        LOL

        Einfachheit ist ein wichtiges, vielleicht das wichtigste, nein, sicher das Wichtigste Prinzip der IT, aber Einfachheit ist nicht zu verwechseln mit Abkürzungen, also Versuchen Sachverhalte auf etwas zu reduzieren, die nur esoterisch verstanden werden.

        Also:

        • Möglichst vollständig die Anforderung beschreiben (gerne auch unter Angabe des Entwicklungsziels)!
        • Ab- und Verkürzungen dabei meiden! Wir sind ja hier nicht alle eingeweiht in die Problematik, auch wenn diese eine Vorgeschichte haben sollte.
        • Konntest Du mit dem (etwas spekulativen ;) Lösungsvorschlag etwas anfangen?
        1. "Möglicherweise" - wir sehen also, dass irgendetwas fehlt bei der (scheinbaren?) Problemfrage, die vielleicht folgende Konzeptfrage ist: Dubletten killen, wie geht das?

          Habe meine Frage genauer gestellt in einem weiteren Eintrag in diesem Thread!

          Meinst Du "Ja, ich will gerne weitere bzw. momentan alle Daten von dem Nutzer haben, deren Name/Vorname gleich ist." aus https://forum.selfhtml.org/?t=144412&m=937169 ?

          LOL

          Einfachheit ist ein wichtiges, vielleicht das wichtigste, nein, sicher das Wichtigste Prinzip der IT, aber Einfachheit ist nicht zu verwechseln mit Abkürzungen, also Versuchen Sachverhalte auf etwas zu reduzieren, die nur esoterisch verstanden werden.

          Also:

          • Möglichst vollständig die Anforderung beschreiben (gerne auch unter Angabe des Entwicklungsziels)!
          • Ab- und Verkürzungen dabei meiden! Wir sind ja hier nicht alle eingeweiht in die Problematik, auch wenn diese eine Vorgeschichte haben sollte.
          • Konntest Du mit dem (etwas spekulativen ;) Lösungsvorschlag etwas anfangen?

          Was ist daran kurz oder wo sind da Abkürzungen?

          Ich möchte halt von den doppelten Namen alle Datensätze haben, wie Vorname, Ort, Telefon, eMail. Was ist daran schwer zu verstehen?

          1. Was ist daran kurz oder wo sind da Abkürzungen?

            Ich möchte halt von den doppelten Namen alle Datensätze haben, wie Vorname, Ort, Telefon, eMail. Was ist daran schwer zu verstehen?

            Konntest Du mit dem (etwas spekulativen ;) Lösungsvorschlag etwas anfangen?

            1. Nein, weil es alles das ist, was ich weiß.

              Leider war aus meiner Sicht kein konkreter oder spekulativer Vorschlag drin. Daher auch mein Beitrag danach!

              1. Nein, weil es alles das ist, was ich weiß.

                Leider war aus meiner Sicht kein konkreter oder spekulativer Vorschlag drin. Daher auch mein Beitrag danach!

                Sagt Dir "Unterabfrage" irgendetwas?