Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie mehrfache Einträge finden? (https://www.delphipraxis.net/27524-wie-mehrfache-eintraege-finden.html)

Chewie 11. Aug 2004 15:56


Wie mehrfache Einträge finden?
 
Ich hab eine MySQL-Tabelle, in der sich Reihen befinden, die in zwei Feldern mit andern Reihen identisch sind. Diese möchte ich finden (nicht um sie zu löschen, sondern um dort einen Verweis auf die nächste Zeile zu setzen).
Geht das mit (My)SQL-Bordmitteln oder benötige ich da externe Programmlogik?

lume96 11. Aug 2004 17:19

Re: Wie mehrfache Einträge finden?
 
Hi,

Reihen soll Record heissen ???

z.B. folgende Tabelle ???

TABLE1

FIELD1 FIELD2 FIELD2
a 1 e
b 2 e
c 3 f
d 2 e
e 3 f
f 4 g

Wenn Dich jetzt die Field2 - Field3-kombination interessiert, würde ich das wie folgt machen :



select t1.field1 from table1 t1
where t1.field2 || t1.field3 in (
select t2.field2 || t2.field3 from table1 t2
group by t2.field2, t2.field3
having count(t2.field2 || t2.field3) > 1)

Dieses sql statement sollte Dir b,c,d,e zurückgeben, allerdings nicht a,f weil bei a und f die
field2-field3-kombination nur einmal vorkommt (also count = 1)

Hoffe, ich hab die Frage richtig verstanden und es hilft weiter.

Lutz

Chewie 11. Aug 2004 18:28

Re: Wie mehrfache Einträge finden?
 
Die Frage hast du richtig verstanden :thuimb:
Leider funktioniert der Query nicht: Es wird ein Fehler gemeldet beim inneren Select.

Robert_G 11. Aug 2004 18:35

Re: Wie mehrfache Einträge finden?
 
Das Problem mit mySQL ist schlicht, dass es einfach nix kann (no Offense :roll: )
Vielleicht kann es das:
SQL-Code:
UPDATE DeineTabelle u
SET   u.LinkedPK = (SELECT Min(t.PK)
                     FROM  DeineTabelle t
                     WHERE t.Feld1 = u.Feld1 and
                            t.Feld2 = u.Feld2 and ...
                     GROUP BY t.Feld1, t.Feld2, ...)
WHERE u.PK != (SELECT Min(t.PK)
                FROM  DeineTabelle t
                WHERE t.Feld1 = u.Feld1 and
                       t.Feld2 = u.Feld2 and ...
                GROUP BY t.Feld1, t.Feld2, ...
                HAVING Count(t.PK) > 1)
Der Code mag zwar eklig aussehen, aber ich bin in solchen Dingen nicht so sehr erfahren (wenn man sich auf _reines_ SQL beschränken muss).

btw: Es gibt auch kostenlose DBs, die was drauf haben zum Bleistift PostgreSQL ;)

lume96 11. Aug 2004 18:59

Re: Wie mehrfache Einträge finden?
 
Sorry,
kenne mich mit MySQL nicht besonders gut aus.

Is 'ne "Quick and Dirty"-Lösung die ich ab und zu mal verwende, allerdings zugegebenerweise nur bei Interbase/Firebird.

Ausserdem ist mir auf der Heimfahrt noch eingefallen, dass meine Lösung einen Bug hat :oops: .

ab || cd = abcd
abc || d = abcd


Also besser die Variante von Robert.

Lutz

Chewie 11. Aug 2004 19:04

Re: Wie mehrfache Einträge finden?
 
@RobertG: Abgesehen davon, dass ich bisher noch keine Ahnung hab, was dein Query macht, krieg ich ne Fehlermeldung:
Zitat:

Unknown system variable 'u'

Robert_G 11. Aug 2004 19:09

Re: Wie mehrfache Einträge finden?
 
Zitat:

Zitat von Chewie
Ich hab eine MySQL-Tabelle, in der sich Reihen befinden, die in zwei Feldern mit andern Reihen identisch sind. Diese möchte ich finden (nicht um sie zu löschen, sondern um dort einen Verweis auf die nächste Zeile zu setzen).

Genau das. ;)
  • DeineTabelle -> rate mal :P
  • LinkedPK -> Die Spalte in der du den Verweis ablegen willst
  • PK -> dein PK
  • t.Feld1, t.Feld2, ... -> die Felder an denen du die doppelten Felder erkennst
  • "u" ist der Tabellen alias für das UPDATE.

Chewie 11. Aug 2004 19:14

Re: Wie mehrfache Einträge finden?
 
Tut mir leid wegen der dummen Fragen, aber: Was ist "mein PK"?

Und zunächst würde es mir reichen, einfach alle doppelten aufgelistet zu sehen. Das Updaten der einen Spalte kann ich auch manuell erledigen.

Robert_G 11. Aug 2004 19:19

Re: Wie mehrfache Einträge finden?
 
Zitat:

Zitat von Chewie
Tut mir leid wegen der dummen Fragen, aber: Was ist "mein PK"?

PK = Primary Key = meist numerische Spalte, die einen Datensatz eindeutig identifieren kann ;)

Zitat:

Zitat von chewie
Und zunächst würde es mir reichen, einfach alle doppelten aufgelistet zu sehen. Das Updaten der einen Spalte kann ich auch manuell erledigen.

Da wird sich nicht viel ändern...
SQL-Code:
SELECT SomeColumns
FROM  DeineTabelle u
WHERE u.PK != (SELECT Min(t.PK)
                FROM  DeineTabelle t
                WHERE t.Feld1 = u.Feld1 and
                       t.Feld2 = u.Feld2 and ...
                GROUP BY t.Feld1, t.Feld2, ...
                HAVING Count(t.PK) > 1)

Chewie 11. Aug 2004 19:34

Re: Wie mehrfache Einträge finden?
 
Verdammt... wegen dem SQl-Bug hab ich oben das UPDATE übersehen. Hat mich schon verwundert :?

Leider tuts immer noch nicht. So sieht meine Tabelle table1 aus:
Code:
id vorname  nachname
id hat den Primary Key. Folgendes Statement:
SQL-Code:
SELECT * 
FROM  table1 u
WHERE u.id != (SELECT Min(t.id)
                FROM  table1 t
                WHERE t.vorname = u.vorname and
                       t.nachname = u.nachname
                GROUP BY (t.vorname, t.nachname)
                HAVING Count(t.id) > 1)
verursacht folgenden Fehler:
Zitat:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT Min(t.id) FROM table1 t WHERE t.vorname = u.vorname and
Benutzt wird Version 4.0.1.6

GuenterS 11. Aug 2004 19:55

Re: Wie mehrfache Einträge finden?
 
Kleiner Hinweis... MySQL kann noch keine SubQueries, soweit ich weiß.

Robert_G 11. Aug 2004 20:03

Re: Wie mehrfache Einträge finden?
 
Sorry, da kann ich dir auch nicht wirklich helfen.

Nur einen Tipp kann ich dir geben: Schaue dir einfach mal PostgreSQL an.
Vielleicht gefällt es dir ja. ;) (ist eine objekt-orientierte DB)
mySQL kann einfach nix :?

Nachtrag:
Zitat:

Zitat von GuenterS
Kleiner Hinweis... MySQL kann noch keine SubQueries, soweit ich weiß.

Da haben wir es ja.

Wie willst du irgendwas in deiner DB ohne SubQueries machen, das über SELECT A FROM B hinausgeht?

Alexander 11. Aug 2004 20:08

Re: Wie mehrfache Einträge finden?
 
Zitat:

Zitat von Robert_G
mySQL kann einfach nix :?

Ist aber schneller als PostgreSQL :tongue:

GuenterS 11. Aug 2004 20:08

Re: Wie mehrfache Einträge finden?
 
Zitat:

Zitat von Robert_G
Wie willst du irgendwas in deiner DB ohne SubQueries machen, das über SELECT A FROM B hinausgeht?

Man muss es selbst programmiertechnisch mit eventuell mehreren SQL statements lösen.

Beispielsweise alle Records in eine Liste und dort die doppelten finden, oder über eine doppelte Schleife, wo man dann jeweils über
select count(*) form meinetabelle where (feld1 = wert1) and ( ... ) ...

die anzahl auslesen und damit auf doppelte schließen kann.


Ich muss mich selbst korrigieren MYSQL 4.1 kann Subselects ...

Einen direkten Vergleich zwischen MySQL, Postgres und MAXDB findest Du hier: Vergleich DBs

lume96 12. Aug 2004 07:31

Re: Wie mehrfache Einträge finden?
 
Hi,

vielleicht kann MySQL ja das :
SQL-Code:
/* Sql query */
select t.* from test t, test u
where t.nachname = u.nachname
and t.vorname = u.vorname
and t.id <> u.id
Sonst wüsste ich auch nicht weiter.

Selbst wenn da klappt, wüsste ich nicht, wie man das entsprechende Update ohne subquery machen könnte. Wenn Du allerdings, wie oben geschrieben, manuell updaten willst, sollte Dir oben genanntes sql statement weiter helfen (falls es denn funktioniert).

Lutz

Chewie 12. Aug 2004 11:08

Re: Wie mehrfache Einträge finden?
 
Die MySQL-Version, die ich hab (4.1) kann Subquerys. Die hab ich auch schonmal hingekriegt, aber ich weiß nicht mehr wie :?
Aber vielleicht find ich ja anhand der Doku raus, wie die genau aussehen müssen. Danke an alle an dieser Stelle.

Und auch nochmal danke an lume96 für das letzte Statement. Ich werds gelich mal probieren.

Edit: lume96, du bist mein Held! Es klappt!

lume96 12. Aug 2004 13:22

Re: Wie mehrfache Einträge finden?
 
Hi,

Freut mich, dass es so läuft.

Noch 'nen kleiner Hinweis : Wenn Du Vor- und Nachnamen vergleichenen willst, und falls die Daten von verschieden Usern eingegeben werden, würde ich unbegingt noch 'n trim() und 'n upper() um jedes 'Field' bauen, z.B.:

SQL-Code:
/**/
where trim(upper(t.nachname))= trim(upper(u.nachname))
Da der Vergleich field1=field2 case-sensitive ist, könnten Dir 'Leertaste' und unterschiedliche Gross- und Kleinschreibung einen Strich durch die Rechnung machen (z.B. 'MEYER' <> 'Meyer ').


MfG
Lutz

Chewie 12. Aug 2004 13:26

Re: Wie mehrfache Einträge finden?
 
Nicht ganz ;)
Bei MySQL wird auch beim Vergleichsoperator = nur zwischen Groß- und Kleinschreibung unterschieden, wenn ein (VAR)CHAR-Feld das Attribut "Binary" hat (bzw. ein BLOB-Feld anstelle eines TEXT-feldes benutzt wird).
Das mit dem Trim ist aber eine gute Idee.

lume96 12. Aug 2004 13:34

Re: Wie mehrfache Einträge finden?
 
Ok, sorry (wie gesagt, ich benutze, beruflich bedingt, eher Interbase/Firebird).

Dabei hatte ich extra kurz in der MySQL Dok nachgeschaut, ob es dort upper()/ucase() und trim() gibt, bevor ich es hier vorschlage.

Lutz


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.

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