janosch: SQL: alle doppelten einträge ausgeben

die doppelten einträge (name und mail gleich) will ich untereinander anzeigen lassen:

so solls aussehen:
*******************************
Max Mustermann kontrollieren!!!
Max Mustermann kontrollieren!!!
Petra Klein kontrollieren!!!
Petra Klein kontrollieren!!!
...
*******************************

hab jetzt mal das geprogged. leider kommt ein mist raus. wirre einträge woran kann das liegen?

$q = mysql_query ("SELECT one.name FROM $k_table AS one, $k_table AS two WHERE one.mail = two.mail;");
while (list($name) = mysql_fetch_array($q)){echo "$name kontrollieren!!! <br>"; }

die andere möglichkeit mit "group by" und "having" habe ich nicht verstanden.

janosch

  1. yo,

    SELECT name, mail
    FROM tabelle
    GROUP BY name
    HAVING count(name) > 1;

    Ilja

    1. yo

      kleiner fehler, muss sein

      SELECT name, mail
      FROM tabelle
      GROUP BY name, mail
      HAVING count(name) > 1;

      1. funktioniert bestens. habe endlich verstanden. kann ich trotzdem alle doppelten 2 mal anzeigen lassen:

        Max Geiger
        Max Geiger
        Peter Hutsch
        Peter Hutsch
        ...
        denn dann kann ich besse die tabellen vergleichen und auswerten, welche ich davon löschen will. danke. janosch

        1. yo,

          funktioniert bestens. habe endlich verstanden. kann ich trotzdem alle doppelten 2 mal anzeigen lassen:

          ist das eine frage ? ;-)

          denn dann kann ich besse die tabellen vergleichen und auswerten, welche ich davon löschen will.

          es handelt sich ja um eine tabelle und nicht um zwei. insofern bin ich mir nicht ganz sicher, was du meinst. aber du kannst dir anzeigen lassen, wie oft die gleiche name/email kombination vorkommt. dazu fügst du zusätzlich zu den spalten name und email nach der SELECT Klausel noche eine spalte count(name) hinzu.

          ich bin mir aber nicht, ob ich deine frag verstanden habe.

          Ilja

          1. ich bin mir aber nicht, ob ich deine frag verstanden habe.

            hallo Ilja,
            so will ich die doppelten gelistet haben:
            Ausgabe:_______________________________________

            Cottbus Yvonne 08.11.2003 96524  1068308117 Ja
            Cottbus Yvonne 18.12.2003 96524  1071745840 Ja
            _______________________________________________

            mit deiner variante kommt es so raus:
            Ausgabe:_______________________________________

            Cottbus Yvonne 08.11.2003 96524  1068308117 Ja
            _______________________________________________

            da kann ich aber das datum der beiden einträge nicht vergleichen und das ist entscheidend hier. denn ich will einen datensatz davon löschen. am liebsten würde ich beide zu einem zusammenfassen und neu in die DB reinschreiben aber das ist bestimmt richtig verzwickt umzusetzen.

            janosch

            1. Vielleicht so?

              SELECT name, mail
              FROM tabelle
              WHERE name IN (
              SELECT name
              FROM tabelle
              GROUP BY name
              HAVING count(name) > 1
              );

              Gruss,
              Daniel

              1. yo,

                unterabfragen ist schon der ein richtiger weg, aber nicht alle dbms können das. deshalb muss man wohl über zwei abfragen oder joins gehen, was auch performance vorteile bringt.

                SELECT tab1.id tab.1name, tab1.mail, tab1.datum...
                FROM tabelle as tab1, tabelle as tab2
                WHERE tab1.name=tab2.name
                AND tab1.id <> tab2id;

                versuch das mal, bin mir aber selbst nicht icher, ob das geht.

                Ilja

                1. geht hier nicht. evtl unterstützt das meine DB net.

                  janosch

                  1. bekommst du einen syntaxfehler oder die flache datenmenge ? und wenn ein syntaxfehler, welche meldung den und welche dbms benutzt du ?

                    Ilja