In Array doppelte Einträge finden

Hallo zusammen

Ich möchte für eine Inkonsistenzprüfung die DB auf doppelte Einträge prüfen. Ich dachte mir, dass ich die Records in ein Array einlese.

$q = query(„SELECT * FROM $table“);
while ($r = fetch($q)) $res[] = $r;

Nun sollte ich im Array $res[] nach doppelten Einträgen suchen können. Das heisst also, dass der Datensatz mit Schlüssel UND Wert identisch ist (mit Ausnahme des Schlüssels ID). Wie mach ich das am besten? Es kann davon ausgegangen werden, dass die Tabelle nicht mehr als 1000 Datensätze enthält.

Oder gibt es sogar einen einfacheren Weg direkt via SQL?

Danke für Eure Hilfe schon im voraus.

Gruss,
Janosh

Nun sollte ich im Array $res[] nach doppelten Einträgen suchen
können. Das heisst also, dass der Datensatz mit Schlüssel UND
Wert identisch ist (mit Ausnahme des Schlüssels ID). Wie mach
ich das am besten?

was huebsches mit array_unique?

Oder gibt es sogar einen einfacheren Weg direkt via SQL?

unbedingt: distinct, group etc

Hallo dog.je

Danke für deine Antwort. Kannst du mir evtl. einen Codeschnippsel geben? Es ist mir einfach zu kompliziert?

Wegen „distinct“ und „group“: Ich will eine function() schreiben, welche prüft, ob in einer beliebigen Tabelle doppelte Datensätze vorkommen. Falls ja, sollen die ID’s der identischen Datensätze angezeigt werden.

Kompliziert ist es daher, weil die function 1. nicht weiss, welche Felder die zu prüfende Tabelle enthält, und weil 2. der Wert im Feld ‚ID‘ trotzdem verschieden sein darf.

Gruss,
Janosh

Ich habs mal soweit wie folgt gelöst:

Die Variable $res[] enthält alle Datensätze der Tabelle.

 foreach ($res as $rec\_to\_check) {
 foreach ($res as $rec\_actual) {
 if (count($rec\_to\_check) != count($rec\_actual) or $rec\_to\_check['id'] == $rec\_actual['id']) continue;
 $identical = true;
 foreach ($rec\_to\_check as $key =\> $value) {
 if ($key == 'id') continue;
 if ($rec\_actual[$key] != $value) $identical = false;
 }
 if ($identical) echo "table $table contains identical records (ID $rec\_to\_check[id] and $rec\_actual[id]).
";
 }
 }

Das Problem ist nun noch bei der Ausgabe. Nämlich wird jeder Fund doppelt ausgegeben. Es wäre schöner wenn eine Liste pro gleiche Einträge (könnten ja auch mehr als 2 sein) angezeigt würde.

Also zum Beispiel so:

Table tbl\_xyz: Identical records in IDs 2,34,78,88
Table tbl\_xyz: Identical records in IDs 4,5
Table tbl\_xyz: Identical records in IDs 54,56,59

Wie könnte man das verbessern?

Gruss,
Janosh