flo: MySQL-Tabellenspalte auf doppelte Einträge prüfen

Hallo zusammen !

Habe zu diesem Problem ein Test-Script geschrieben. Das Funktioniert auch soweit. Nur bei Einträgen > 10000 ist das ganze ein bischen lahm.

Könnte man das Ganze irgendwie besser lösen ?

Tabelle testperfco mit Spalte Nr und EMail

Code:

<?php

require("../db_mysql.inc.php");

// Set the variables for the database access:

$db = new DB_Sql;
$db->Host = "localhost";
$db->Database = "fwinkler";
$db->User = "";
$db->Password = "";

for ($j=1; $j<=10000; $j++)
{

//$j = 10000;

$db->query("SELECT EMail FROM testperfco WHERE Nr='$j'");
 $db->next_record();

$EMail = $db->f('EMail');

$db->query("SELECT COUNT(*) AS Doppelt FROM testperfco WHERE EMail='$EMail'");
 $db->next_record();

$doppelt = $db->f('Doppelt');

if ($doppelt > 1)
 {

print("$doppelt");
  print(" ");
  print("mal");
  print(" ");
  print("$EMail");
  print(" ");
  print("bei Nr $j");
  print("<br><br>");

//print("check Nr $j");
  //print("<br><br>");

$db->query("UPDATE testperfco SET Error='E-Mail-Adresse checken' WHERE Nr='$j'");
 }
 /*
 else
 {
 print("$j");
 print("<br><br>");
 }
 */
}

?>

  1. Hallo,

    Bin leider noch kein PHP-Profi, aber zum Grundprinzip der Datenbankabfragen kann ich Dir folgendes sagen:

    1. Alle daten mit WHERE NR <= 10000 oder einem anderen Filterkriterium.
    2. Den Test auf doppelte Emails würde ich mit einer Liste oder Array o.ä. realisieren, wo alle abgearbeiteten Drinne stehen, tritt eine nochmal auf, Abarbeitung nicht durchführen.
    3. Nummern mit Abarbeitung sammeln und dann UPDATE ... WHERE Nr IN (1,2,3..)

    HTH

    Gruß Frank

  2. Hallo,

    Habe zu diesem Problem ein Test-Script geschrieben. Das Funktioniert auch soweit. Nur bei Einträgen > 10000 ist das ganze ein bischen lahm.

    Könnte man das Ganze irgendwie besser lösen ?

    Tabelle testperfco mit Spalte Nr und EMail

    Du könntest z.B. zuerst einmal alle Email-Adressen rausfinden, welche doppelt sind:

    SELECT email
      FROM testperfco
      GROUP BY email
      HAVING count(*) > 1

    Mit der Liste der so ermittelten Email-Adressen (welche hoffentlich deutlich weniger als 10000 sind *g*) kannst Du dann in einem weiteren Schritt machen, was Du willst.

    Allerdings würde ich die Tabellendefinition derart ändern, daß doppelte Einträge gar nicht vorkommen können, Stichwort 'unique index'.

    Grüße
      Klaus