dedlfix: Query um Doubletten in einer DB zu finden und anzuzeigen

Beitrag lesen

Hi!

Du hast ein Datenbankproblem. Sei in deinem eigenen Interesse bitte so zuvorkommend deinen potentiellen Antwortern gegenüber, die PHP-Code-Teile aus dem Problem herauszuhalten, also gleich nachvollziehbaren (koopierbaren) SQL-Code zu liefern. Und dann zeichne bitte auch SQL-Syntax nicht mit lang=php sondern mit lang=sql aus. Danke.

Moechte ein eigentlich simples Problem loesen, naemlich alle doppelten Eintraege aus meiner Mysql anzeigen lassen, damit diese geprueft werden koennen. Das loeschen erfolgt manuell.

Die einzige (mir bekannte) Möglichkeit, Dubletten zu finden, ist eine Gruppierung mit anschließendem HAVING COUNT()>1

Habe inzwischen eine Reihe von Varianten versucht, aber alle brachten wie auch diese nur EINEN doppelten Eintrag als Ergebniss.

Das "Problem" beim GROUP BY ist, dass es eine Aggregat-Klausel ist, also die gruppierten Einträge zu einem zusammenfasst. Und da dann nicht genau bestimtm werden kann, welcher der Datensätze nun die Daten für die SELECT-Klausel liefern soll, darf man üblicherweise nur die gruppierten Felder und Aggregat-Funktionen in die SELECT-Klausel schreiben. MySQL lässt hier zwar auch andere Felder zu, aber mit ungewissem Ergebnis.

GROUP_CONCAT() kann zumindest die Werte eines Feld der Gruppe zu einem String zusammenketten. Damit könntest du eine Liste der IDs bekommen, anhand derer du in einem zweiten Schritt die betroffenen Datensätze abfragen kannst.

Vermutlich brauche ich eine INNER JOIN abfrage, nur gelingt es mir nicht diesen Code so anzupassen das er bei mir laueft.

Woraus vermutest du das? Wie wurde an der Fundstelle erklärt, was der Trick an speziell dieser Lösung ist?

SELECT A.[Personen-Id] As [Datensatz-ist-Kandidat-zum-Loeschen]

From tbl_Personen As A INNER JOIN

  (Select X.Nachname, X.Vorname, X.Geburtstag  
  	From tbl_Personen As X  
  	Group By X.Nachname, X.Vorname, X.Geburtstag  
  	Having Count(*) > 1) As B  

On A.Nachname = B.Nachname
And A.Vorname = B.Vorname
And A.Geburtstag = B.Geburtstag


>   
> Koennte mir bitte jemand helfen wie saehe der korrekte Query aus um NUR alle mindest 2x vorkommenden Eintraege als Ausgabe zu erhalten.  
  
Sieht doch passabel aus (der Alias X ist überflüssig). Woran scheitert es denn konkret bei dir?  
  

> Der Query muesste auch die Abfrage einer zweiten Tabelle beinhalten, nur wenn ich es soooo mache kommen ganz wirre Ergebnisse heraus.  
> SELECT ... FROM #\_\_unimap\_markers, #\_\_unimap\_cats  
>              GROUP BY #\_\_unimap\_markers.wp\_latitude,wp\_longitude  
>              HAVING COUNT(\*) > 1  
  
Du hast damit einen Join gebaut, bei dem ein kartesisches Produkt herauskommt, also jeder Datensatz mit jedem verknüpft ist. Wenn du den Sinn erklären würdest, warum du die zweite Tabelle benötigst ...  
  
  
Lo!