Eliminierung von Dubletten und falschen Adressen

louna

Grünschnabel
Hallo,
Vielleicht kann mir jemand mit folgendem Problem helfen:
Eliminierung von Dubletten und falschen Adressen, anhand von der Tabelle user .
Momentan wird mir nur ein Datensatz ausgegeben vorhanden sind aber weitaus mehrere.
PHP:
$users = array();
 $db->Query('SELECT id, email, vorname, nachname, strasse, hnr, plz, ort, gruppe, gesperrt, COUNT(*) AS Count FROM users GROUP BY ort, plz, strasse HAVING Count  > 1 '); 
                while($row = $res->FetchArray(MYSQL_ASSOC))
                {

                        $users[$row['id']]                 = $row;
                }
                $res->Free();

                // assign
               ;
                $tpl->assign('users', $users);

Danke
 
Da machst du einen kleinen Denkfehler, der Query sollte etwa so aussehen (ich nehme mal an, du vergleichst Ort, Strasse und PLZ, kann natürlich angepasst werden):

SQL:
SELECT
    *
FROM
    users
WHERE
    (ort, strasse, plz) IN (
    SELECT
        COUNT(*) as anzahl, ort, strasse, plz
    FROM
        users
    GROUP BY
        ort, strasse, plz
    WHERE
        anzahl > 1
    );

Dies sollte dir alles doppelten User liefern (Query ungetestet, kann schreibfehler enthalten, aber ich hab grad keine passende DB-Struktur ;) ).

Erklärung:
Du machst einen sogenannten Subquery, du musst das ganze von "innen nach aussen" lese:

- Zuerst zählst du die Anzahl gleicher Einträge und nimmst nur die, die mehr als einmal vorkommen (GROUP BY hilft dir da).
- Gebe aus diesen Einträgen alles aus (*)
 
Zuletzt bearbeitet:
Hallo,

Erstmal Danke für deine Hilfe ;), leider bekomme ich einen Fehler

PHP:
Fatal error: Call to a member function FetchArray() on a non-object

mfg
 
Wies mir scheint, benützt du irgendwelche Klassen, kannst du mir mehr Code geben?

Wie hängen $db und $res zusammen?

Hab noch einen einfacheren Query zum ausprobieren:
SQL:
SELECT
    *
FROM
    users
GROUP BY
    strasse, ort, plz
HAVING
        COUNT(strasse) > 1
    AND
        COUNT(ort) > 1
    AND
        COUNT(plz) > 1
;
 
Hallo,

Hat mir vielleicht noch jemand ne Möglichkeit, da ich immernoch den gleichen Fehler bekomme ?

mfg
 
Welche Datenbankklasse benützt du denn? Werden da Fehler in Querys ausgegeben, sowas alà $db->hasError()?
 
Hallo,

Ich nutze mysql, das ist der Einzige Fehler der mir angezeigt wird.
PHP:
Fatal error: Call to a member function FetchArray() on a non-object in
 
Wenn ich diesen query nehme bekomme ich einen User Angezeigt, es sind aber mit sicherheit mehr (um sicher zu gehen habe ich nochmals zwei User mit gleichen Adresse Daten angelegt)

PHP:
$res = $db->Query(' SELECT * FROM {pre}users GROUP BY strasse, ort, plz HAVING COUNT(strasse) > 1 AND COUNT(ort) > 1 AND COUNT(plz) > 1');
 
Also, ich habe mir jetzt eine Testtabelle angelegt. Folgendermaßen funktioniert es bei mir:
SQL:
SELECT
	`id`,
	`email`,
	`vorname`,
	`nachname`,
	`strasse`,
	`hnr`,
	`plz`,
	`ort`,
	`gruppe`,
	`gesperrt`,
	COUNT(*) AS `count`
FROM
	`adressen`
GROUP BY
	`ort`,
	`plz`,
	`strasse`
HAVING `count`  > 1

Mit dieser Abfrage bekommst du jetzt, wenn du z.B. drei Datensätze hast, wovon zwei die gleiche Adresse haben, genau eine Zeile zurückgeliefert, da du die Datensätze ja nach gleichen Adressen gruppierst und dann eben schaust, in welchem Datensatz mehr als eine Adresse ist.

Wenn du alle doppelten Datensätze haben willst, kannst du folgende Query verwenden:
SQL:
SELECT
	`id`,
	`email`,
	`vorname`,
	`nachname`,
	`strasse`,
	`hnr`,
	`plz`,
	`ort`,
	`gruppe`,
	`gesperrt`,
	(SELECT
		COUNT(`id`) AS `count`
		FROM
			`adressen` `a2`
		WHERE
			`a2`.`strasse` = `a1`.`strasse`
		GROUP BY
			`ort`,
			`plz`,
			`strasse`) AS `count`
FROM
	`adressen` `a1`
HAVING
	`a1`.`count`  > 1
 
Zuletzt bearbeitet:
Hallo wenn ich jetzt diesen Query nutze, bekomme ich wieder den gleichen Fehler.
Hast du ne Idee woran das liegen könnte ?

PHP:
$res = $db->Query('SELECT `id`,`email`,`vorname`,`nachname`,`strasse`,`hnr`,`plz`,`ort`,`gruppe`,`gesperrt`, (SELECT COUNT(*) AS `count` FROM `adressen` `a2` WHERE `a2`.`strasse` = `a1`.`strasse` GROUP BY `ort`, `plz`, `strasse`) AS `count`FROM `adressen` `a1`HAVING `a1`.`count` > 1');
 
Zurück