3.4k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,

brauche mal Hilfe mit einer SQL-Abfrage. Und zwar versuche ich doppelte Adresseinträge aus einer Datenbank auszulesen.
Habe es jetzt schon hinbekommen jeweils einen Eintrag auszulesen. Mit der folgenden Abfrage:

SELECT * FROM adr_adressen WHERE (SELECT f_adr FROM adr_adressen GROUP BY f_adr HAVING count(f_adr) > 1 ORDER BY f_adr DESC LIMIT 1) = f_adr


Ohne das Limit bekomme ich leider folgende Fehlermeldung:

Error Code : 1242
Subquery returns more than 1 row
(0 ms taken)


Hat irgendjemand eine Ahnung wie der Query richtig aussehen muss um alle Datensätze zu bekommen?

Gruß,
S1lv3R

6 Antworten

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo S1lv3R,

du schreibst zwar nicht mit welchem SQL-Dialekt du arbeitest, aber mit folgendem Code läufts z.B. unter Access, Oracle, ...
SELECT * FROM adr_adressen WHERE f_adr in (SELECT f_adr FROM adr_adressen GROUP BY f_adr HAVING count(*) > 1)

Gruß
Ralf
0 Punkte
Beantwortet von
Hey Ralf,
ist MySQL, läuft aber trotzdem... bis auf die Performance ... ohne LIMIT (auf 10 000 Adressen) läuft es gar nicht durch.

SELECT * FROM adr_adressen WHERE f_adr in (SELECT f_adr FROM adr_adressen GROUP BY f_adr HAVING count(*) > 1) ORDER BY f_adr LIMIT 100


(100 row(s)returned)
(367547 ms taken)


mehr als 6 Minuten für die Abfrage bei Verwendung von 1% der Daten ... während die Ausgabe aller Datensätze (SELECT * FROM adr_adressen) grade mal 157 Millisekunden dauert.

:-(

Gruß,
Malte
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo,

Hast du einen Index auf f_adr gesetzt?

Gruß
Ralf
0 Punkte
Beantwortet von
Guten Morgen Ralf,

Nein, explizit habe ich das nicht getan ... dumme Frage, aber wo muss man im phpmyadmin klicken? ;-)

Danke schonmal!

Gruß,
Malte
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Malte,

wenn du in phpmyadmin einen SQL-Editor öffnest (Datenbank auswählen und Sheet SQL öffnen), kannst du direkt per SQL den Index anlegen mit
create index idx_f_adr on adr_adressen (f_adr) ;
oder du klickst dich durch die Tabelle, gehst auf das Tabellenfeld aktiviert den Icon für die Indexerstellung (Tabelle mit Blitzsymbol).
Probiere es mal aus, ich bin gespannt, ob es danach besser läuft.

Gruß
Ralf
0 Punkte
Beantwortet von
Guten Abend Ralf,

läuft super! :-)

Ohne Limit:
(3261 row(s)returned)
(115766 ms taken)


Mit Limit 100:
(100 row(s)returned)
(172 ms taken)


Das nenn ich Optimierung ... Danke für deine Hilfe! :-)

Gruß,
Malte
...