Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL doppelte Datensätze anzeigen... (https://www.delphipraxis.net/103705-mysql-doppelte-datensaetze-anzeigen.html)

NetSonic 20. Nov 2007 14:57

Datenbank: MySQL • Version: 5 • Zugriff über: ZeosLib

MySQL doppelte Datensätze anzeigen...
 
Ich habe eine Kundendatenbank mit ca. 5000 Datensätzen, aus denen ich doppelte Einträge herausfiltern kann. Dazu nutze ich diese Abfrage...

SQL-Code:
SELECT * FROM tblkunden WHERE Nachname != '' AND Vorname != '' AND Nachname IS NOT NULL AND Vorname IS NOT NULL
AND (Nachname IN (SELECT Nachname FROM tblkunden GROUP BY Nachname, Vorname HAVING count(Nachname) > 1)
AND (Vorname IN (SELECT Vorname FROM tblkunden GROUP BY Vorname, Nachname HAVING count(Vorname) > 1)))
ORDER BY Nachname, Vorname;
Ich erhalte auch die doppelten Einträge, allerding sind gelegentlich auch einfach nur einmal vorhandene Einträge aufgeführt.
Hier mal das Result der Abfrage:

NACHNAME + VORNAME
-------------------
Mustermann + Klaus
Mustermann + Klaus
Musterberg + Bernd (falsch, gibt es nicht doppelt, wird aber angezeigt)
Musterfrau + Manfred
Musterfrau + Manfred
Muster + Klaus (falsch, gibt es nicht doppelt, wird aber angezeigt)


Ich vermute, dass ich einfach eine "Kinke" in meiner Abfrage habe und den Wald vor lauter Bäumen einfach nicht durchblicken kann.

Bernhard Geyer 20. Nov 2007 15:02

Re: MySQL doppelte Datensätze anzeigen...
 
Probiers mal damit:
SQL-Code:
SELECT Nachname, Vorname, Count(Nachname) FROM tblkunden
GROUP BY Nachname, Vorname
HAVING Count(Nachname) > 1

Jelly 20. Nov 2007 15:06

Re: MySQL doppelte Datensätze anzeigen...
 
Warum arbeitest du mit Subselects... Probiers doch einfach mal so:

SQL-Code:
select Nachname, Vorname, count(*) as N from tblkunden group by Nachname, Vorname having count(*) > 1
In deiner Abfrage ist sogar noch ein logischer Fehler drin, wenn ich das richtig sehe. Denn hast du 2 Wagener in deiner Tabelle, mit unterschiedlichen Vornamen (Marc und Toni), so kann dir deine Abfrage den Wagener trotzdem als doppelt liefern, und zwar dann, wenn noch irgendeine andere, dritte PErson, den Vornamen Marc oder Toni hat.

NetSonic 20. Nov 2007 15:08

Re: MySQL doppelte Datensätze anzeigen...
 
Dann bekomme ich ja nur die Anzahl der doppelten Treffer, ich benötige aber eine vollständige Übersicht der doppelten Einträge (inkl. Straße, PLZ, Ort etc.), damit der Anwender entscheiden kann, welcher Datensatz der falsche ist!

Jelly 20. Nov 2007 15:19

Re: MySQL doppelte Datensätze anzeigen...
 
Dann könntest du versuchen, über einen SELF JOIN die Informationen zu finden:

SQL-Code:
SELECT a.Nachname, a.Vorname, a.Ort, a.Strasse,
COUNT(b.Id) AS Anzahl
FROM tblkunden a
LEFT JOIN tblkunden b
ON a.Nachname=b.Nachname and a.Vorname=b.Vorname
GROUP BY a.Nachname, a.Vorname, a.Ort, a.Strasse
HAVING COUNT(b.Id)> 1
So in der Art.

NetSonic 20. Nov 2007 16:57

Re: MySQL doppelte Datensätze anzeigen...
 
Hm, jetzt wird es komisch... folgendes Phänomen mit dieser Abfrage...

SQL-Code:
SELECT a.Nachname, a.Vorname, a.Ort, a.Strasse
FROM tblkunden a
LEFT JOIN tblkunden b
ON a.Nachname=b.Nachname and a.Vorname=b.Vorname WHERE a.Nachname != '' AND a.Vorname != '' AND a.Nachname IS NOT NULL AND a.Vorname IS NOT NULL AND b.Nachname != '' AND b.Vorname != '' AND b.Nachname IS NOT NULL AND b.Vorname IS NOT NULL
GROUP BY a.Nachname, a.Vorname, a.Ort, a.Strasse
HAVING COUNT(a.Nachname) > 1
werden mir die Daten so angezeigt

NACHNAME - VORNAME
Mustermann - Klaus
Mustermann - Klaus
Muster - Frank
Musterfrau - Gerd
Musterfrau - Gerd

soweit, so gut... MUSTER FRANK wird mir nur einmal angezeit, befindet sich wie alle anderen Einträge aber auch doppelt in der Datenbank. MUSTERMANN KLAUS und MUSTERFRAU GERD sind doppelt drin und werden korrekt angezeigt... was nun, was geht da vor, was mache ich da falsch?

NetSonic 20. Nov 2007 17:52

Re: MySQL doppelte Datensätze anzeigen...
 
Also, damit nochmal klar wird, was ich möchte und wo mein Problem liegt...

Ich habe eine Kundendatenbank mit ca. 5000 Datensätzen und möchte mir in meiner Anwendung alle doppelten Datensätze anzeigen.
Ich will nicht die Anzahl der doppelten Datensätze wissen, sondern ich will die doppelten Datensätze komplett sehen, damit ich entscheiden kann, welcher Datensatz gelöscht werden kann. Das soll dann tabellarisch so aussehen...

NACHNAME - VORNAME
------------------
Mustermann - Tom
Mustermann - Tom
Musterfrau - Gerda
Musterfrau - Gerda

Wie muss ich dafür die SQL-Abfrage aufbauen? Wie wäre der Lösungsansatz am besten anzugehen?! Ich finde zur Zeit einfach nicht den richtigen Lösungsansatz!

DeddyH 20. Nov 2007 18:03

Re: MySQL doppelte Datensätze anzeigen...
 
Versuch es mal so:
SQL-Code:
SELECT A.Name,A.Vorname
FROM tblkunden A
JOIN tblkunden B ON B.Name = A.Name AND B.Vorname = A.Vorname
GROUP BY A.Name,A.Vorname
HAVING COUNT (*) > 1

NetSonic 20. Nov 2007 18:06

Re: MySQL doppelte Datensätze anzeigen...
 
Mit der Abfrage...

SQL-Code:
SELECT A.Nachname,A.Vorname
FROM tblkunden A
JOIN tblkunden B ON B.Nachname = A.Nachname AND B.Vorname = A.Vorname
GROUP BY A.Nachname,A.Vorname
HAVING COUNT(*) > 1
bekomme ich leider nur den doppelten Eintrag angezeigt, nicht beide bzw. alle doppelten, wie ich es benötige...

mkinzler 20. Nov 2007 18:10

Re: MySQL doppelte Datensätze anzeigen...
 
Dann mußt du nun den Rest dazujoinen

DeddyH 20. Nov 2007 18:13

Re: MySQL doppelte Datensätze anzeigen...
 
Dann benutz die Abfrage doch als Subselect (nicht sehr schön, hat aber unter Firebird bei mir funktioniert).
SQL-Code:
SELECT Name,Vorname
FROM tblkunden
WHERE Name IN(
   SELECT A.Name
   FROM tblkunden A
   JOIN tblkunden B ON B.Name = A.Name AND B.Vorname = A.Vorname
   GROUP BY A.Name
   having COUNT (*) > 1)
AND Vorname IN(
   SELECT A.Vorname
   FROM tblkunden A
   JOIN tblkunden B ON B.Name = A.Name AND B.Vorname = A.Vorname
   GROUP BY A.Vorname
   having COUNT (*) > 1)

shmia 20. Nov 2007 18:14

Re: MySQL doppelte Datensätze anzeigen...
 
ich weiss nicht, ob MySQL folgende Abfrage noch verkaftet, aber so könnte es gehen:
SQL-Code:
SELECT tblkunden.*
FROM
tblkunden INNER JOIN (SELECT A.Nachname,A.Vorname
FROM tblkunden A
JOIN tblkunden B ON B.Nachname = A.Nachname AND B.Vorname = A.Vorname
GROUP BY A.Nachname,A.Vorname
HAVING COUNT(*) > 1) DevTbl
ON tblkunden.Vorname=DevTbl.Vorname AND tblkunden.Nachname=DevTbl.Nachname
ORDER BY tblkunden.Nachname

omata 20. Nov 2007 19:55

Re: MySQL doppelte Datensätze anzeigen...
 
Hallo NetSonic,

vielleicht so...

SQL-Code:
SELECT * 
FROM tblkunden x
WHERE COALESCE(nachname, '') <> ''
  AND COALESCE(vorname, '') <> ''
  AND EXISTS (SELECT nachname, vorname
              FROM tblkunden
              WHERE nachname = x.nachname
                AND vorname = x.vorname
              GROUP BY nachname, vorname
              HAVING COUNT(*) > 1)
ORDER BY nachname, vorname
Gruss
Thorsten

NetSonic 21. Nov 2007 09:15

Re: MySQL doppelte Datensätze anzeigen...
 
Hey shmia, leider legt mein MySQL-Server bei der Abfrage eine lange, lange Pause ein... aber die SQL-Abfrage von omata macht genau das, was ich wollte. :thumb:
Jetzt bekomme ich alle doppelten / mehrfach vorhandenen Datensätze angezeigt, und der Anwender kann entscheiden, welcher Eintrag entfernt werden soll / muss!

Danke an alle, die sich mit meinem Problem befasst haben! :dp:

Gonso 23. Dez 2007 15:39

Re: MySQL doppelte Datensätze anzeigen...
 
@omata

kann man deine abfrage so verändern, dass ich nur doppelte datensätze bekomme aber nur einzeln.
deine abfrage zeigt mir in meiner tabelle 20 doppelte datensätze (10 * 2 datensätze.
Ich möchte nur 10 sehen, die zwar doppelt sind aber nicht doppelt angezeigt werden sollen.

als doppelt gilt: gleiche nachname und vorname.

Ich sollte aber alle felder in einem datensatz sehen (auch z.b. adresse, plz und noch viel mehr ca. 30 felder)

DeddyH 23. Dez 2007 16:14

Re: MySQL doppelte Datensätze anzeigen...
 
In Anlehnung an meinen Beitrag #8:
SQL-Code:
SELECT A.Name,A.Vorname,A.bla,A.blubb,A...
FROM tblkunden A
JOIN tblkunden B ON B.Name = A.Name AND B.Vorname = A.Vorname
GROUP BY A.Name,A.Vorname,A.bla,A.blubb,A...
HAVING COUNT (*) > 1

Gonso 23. Dez 2007 18:55

Re: MySQL doppelte Datensätze anzeigen...
 
@DeddyH : danke (ist [leider] nur die halbe antwort)

man muss bei DeddyH alle felder angeben. ich wollte nur nachname und vorname angeben und alle andere felder nicht. ich habe 20 tabellen erstellt mit sehr vielen feldern und die angabe von allen felder ist sehr mühsam und keine allgemeine lösung.

kann mir jemand helfen?

DeddyH 23. Dez 2007 19:20

Re: MySQL doppelte Datensätze anzeigen...
 
Entschuldige, aber Du hast ein suboptimales DB-Design kreiert und jetzt ist Dir die Angabe der zu ermittelnden Felder zuviel Arbeit?

Gonso 23. Dez 2007 19:30

Re: MySQL doppelte Datensätze anzeigen...
 
ich habe nicht geschrieben, dass ich zu faul bin sondern, dass deine lösung (die ich auch vorher kannte) keine allgemeine lösung ist.

bei der abfrage von experte omata bruacht man auch nicht alle felder einzugeben (nur die index felder). ich suche eine allgemein lösung und keine diskusion über [suboptimales DB-Design].

DeddyH 23. Dez 2007 19:33

Re: MySQL doppelte Datensätze anzeigen...
 
Das liegt daran, dass er in der äußeren Abfrage den Stern benutzen kann. Leider geht AFAIK DISTINCT(*) nicht.

omata 24. Dez 2007 00:39

Re: MySQL doppelte Datensätze anzeigen...
 
Zitat:

Zitat von Gonso
...kann man deine abfrage so verändern, dass ich nur doppelte datensätze bekomme aber nur einzeln. ... Ich möchte nur 10 sehen, die zwar doppelt sind aber nicht doppelt angezeigt werden sollen.

als doppelt gilt: gleiche nachname und vorname.

Ich sollte aber alle felder in einem datensatz sehen

Hallo Gonso,

kleine Gegenfrage: Wenn es doppelte Datensätze (nachname und vorname) gibt und sich diese Zeilen dann in der Adresse unterschieden, welche der beiden Adressen möchtest du sehen bzw. welche Zeile soll nicht ausgegeben werden?

Denk da nochmal drüber nach, bin auf eine Antwort gespannt.

Gruss
Thorsten

Gonso 24. Dez 2007 02:07

Re: MySQL doppelte Datensätze anzeigen...
 
hallo omata!

deine frage ist berechtigt und zwang mich zum nachdenken und ich kam zum folgendem ergebnis:

in einer tabelle möchte man nachträglich unique index setzen (nachname, vorname).
beispiel: ich habe zwei datensätze wo die felder nachname und vorname gleich sind (als gleich verstehe ich entsprechend gleiche inhalte => auch leer oder is null). somit gelten solche zwei datensätze für mich als doppelt vorhanden auch wenn sich alle andere felder voneinander unterscheiden.

unter diesen umständen definiere ich einen datensatz als doppelt: das ist ein datensatz, der (später) gegen die unique- regeln (nachname, vorname) verstoßen würde. folgend ist es für mich nicht nötig einen von beiden bevor zuziehen

ANTWORT AUF DEINE FRAGE: es ist egal welchen datensatz ich zu sehen bekomme, hauptsache nur einen von beiden und nur solche die doppelt vorhanden sind.

es wäre echt cool, wenn du so was hingekriegt hättest!

du kannst auch zeigen wie kann man solche abfragen steuern, wenn man z.b. zusätzlich einen von den beiden datensätze sehen möchte der früher erstellt wurde (feld: erfdatum : tdatetime).

danke dass du dich gemeldet hast

omata 24. Dez 2007 02:33

Re: MySQL doppelte Datensätze anzeigen...
 
Hallo Gonso,

ok, mit deinen zusätzlichen Infos kann man natürlich arbeiten...
SQL-Code:
SELECT *
FROM tblkunden x
WHERE COALESCE(nachname, '') <> ''
  AND COALESCE(vorname, '') <> ''
  AND EXISTS (SELECT nachname, vorname
              FROM tblkunden
              WHERE nachname = x.nachname
                AND vorname = x.vorname
              GROUP BY nachname, vorname
              HAVING COUNT(*) > 1)
  AND erfdatum = (SELECT MAX(erfdatum)
                  FROM tblkunden
                  WHERE nachname = x.nachname
                    AND vorname = x.vorname)
ORDER BY nachname, vorname
Hier wird nur der letzte Datensatz angezeigt, wenn es der Erste sein soll, nimm MIN.

Gruss
Thorsten

Gonso 24. Dez 2007 13:47

Re: MySQL doppelte Datensätze anzeigen...
 
Hallo OMATA!

sehr elegant und sauber, eben Qualitäts-Antwort.

ein weihnachtsgeschenk das ich so nicht verdient habe.

wie schon geschrieben: ich bewundere DEIN Expertenwissen!

danke Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz