Moin!
soweit hat alles geklappt. geht auch:
Nein, geht NICHT.
Da kommt vielleicht ein Ergebnis raus, aber keinesfalls ein definiertes Ergebnis.
SELECT * , count(name) as zahl, count(vorname) as zahl2 FROM $k_table GROUP BY name HAVING zahl > 1 AND zahl2 > 1;"
Du kannst kein SELECT * machen, wenn du GROUP BY benutzt.
GROUP BY untersucht die angegebenen Felder auf Identitäten. Werden zwei Datensätze gefunden, die in diesen beiden Feldern identisch sind, werden sie zu einem zusammengefaßt.
Also beispielsweise beim Nachname/Vorname:
Meier, Andreas
Meier, Willem
Diese beiden haben identische Nachnamen, werden also mit GROUP BY zu einem Datensatz zusammengefaßt. Aber welcher Vorname wird genommen?
Normale Datenbanken geben bei SELECT * (oder auch nur SELECT vorname) in diesem Fall einen Fehler aus, weil du nicht definiert hast, welchen der beiden Daten du geliefert haben willst. MySQL sucht sich _irgendeinen_ existierenden und von der Verdopplung betroffenen Datensatz aus! Wenn ich es richtig erinnere, sogar mit der Möglichkeit, bei weitere existierenden Feldern Daten aus ganz anderen Datensätzen zu nehmen. Du hast also das große Lotteriespiel!
Deshalb ist es ernstgemeint: Wenn du nicht nur die doppelten Namen wissen willst, sondern auch die korrekten, dazugehörigen Datensätze, mußt du in der Tat zwei SQL-Abfragen machen: Einmal alle doppelten Namen, und mit diesen Namen dann je Name eine weitere Abfrage nach allen entsprechenden Datensätzen. Bedenke: Es ist gerade bei Namen absolut normal, wenn Dopplungen auftreten - ist die Frage, was du mit dieser Information überhaupt anfangen willst, bzw. was mit den ermittelten Datensätzen passieren soll.
wenn ich zwei felder auf doppelte prüfen will?
Dann machst du ein SELECT auf alle Felder, die in den beiden (drei, vier,...) Datensätzen 100% übereinstimmen sollen, und schreibst diese allesamt auch ins GROUP BY.
SELECT name, vorname, count(name) as zahl FROM tabelle GROUP BY name, vorname HAVING zahl > 1;
Bitte: _Keinerlei_ SELECT * reinfummeln. Du kriegst damit wirklich nur Müll geliefert - auch wenn das Ergebnis supertoll aussehen mag, und du mit kleinen Testdaten wirklich scheinbar toll-verläßliche Datensätze ausgewählt kriegst.
Wenn du wirklich wissen willst, wer sich hinter den Datensätzen versteckt, mußt du mit jedem auf die obige Weise gewonnenen Datensatz eine weitere Abfrage machen:
SELECT name, vorname, feld3, feld4, feld5 FROM tabelle WHERE name = "gefundener_name" AND vorname = "gefundener_vorname";
Zu "SELECT *" lies bitte:
http://www.dclp-faq.de/q/q-sql-select.html
- Sven Rautenberg
Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!