Duplikate in MySql Datenbank löschen

Alles, was PHP betrifft, kann hier besprochen werden.

Duplikate in MySql Datenbank löschen

Postby deiszner » 09. October 2004 20:57

Hallo,

ich habe eine Datenbank vorliegen mit z.B. Nummer und Name

1 Müller
2 Meier
3 Schmidt
4 Müller
5 Meier
6 Meyer
7 Schmidt
8 Schulze

Nach dem laufenlassen des Skriptes sollen nur noch
1, 2 3, 6, 8 übrigbleiben?

Gibts dafür vielleicht schon ein fertiges Skript - Google hat leider nicht weiterhelfen können.
Alles schöne am Leben hat einen Haken. Es ist unmoralisch, illegal oder es macht dick.
deiszner
 
Posts: 128
Joined: 30. December 2002 12:18
Location: Leipzig

Postby PF4 » 09. October 2004 22:40

Nein, leider nicht,
darüber haben sich schon hunderte Leute das Hirn zerbrochen.
Mysql stellt dafür keine fertige Punktion zur Verfügung

Bei kleinen DB kannste es so machen.

Einen Datensatz einlesen
daraus nen 2 Query machen mit WHERE mit ALLEN daten des ersten querys
von 2 die Anzahl der Datensätze zählen
Wenn mehr als 1 nen DELETE mit limit 1
Wenn 1 dann nix tuen.
Das ganze is aber langsam.
PF4
 
Posts: 528
Joined: 10. March 2003 09:15

Re: Duplikate in MySql Datenbank löschen

Postby Wiedmann » 10. October 2004 14:32

deiszner wrote:Gibts dafür vielleicht schon ein fertiges Skript - Google hat leider nicht weiterhelfen können.

Fertig nicht. So eine Situation zeugt eher vom schlechten DB-Design ;-)

Könnte aber z.B. so aussehen:
Code: Select all
<pre>
<?php
$db_name = '';
$db_user = '';
$db_pass = '';

$link = mysql_connect('', $db_user, $db_pass)
   or die('Fehler: '.mysql_error());
mysql_select_db($db_name, $link)
   or die('Fehler: '.mysql_error());

$db_query = "
   SELECT `Nummer`, `Name`
   FROM `test`
   ORDER BY `Nummer` ASC
   ";
$result = mysql_query($db_query, $link)
   or die('Fehler: '.mysql_error());
$anzahl = mysql_num_rows($result);
echo $anzahl.' Datensätze insgesamt.'."\n";

if (1 < $anzahl) {
   while ($row = mysql_fetch_assoc($result)) {
      $ausgang[$row['Nummer']] = $row['Name'];
   }
   $ziel = array_unique($ausgang);
   $differenz = array_diff_assoc($ausgang, $ziel);
   $anzahl = count($differenz);
   echo $anzahl.' Datensätze doppelt.'."\n";

   if (0 < $anzahl) {
      $differenz = array_keys($differenz);
      $differenz = implode(',', $differenz);
      
      $db_query = "
         DELETE
         FROM `test`
         WHERE `Nummer` IN ($differenz)
         ";
      $result = mysql_query($db_query, $link)
         or die('Fehler: '.mysql_error());
      echo mysql_affected_rows($link).' Datensätze wurden gelöscht!'."\n";
   }
}

mysql_close($link)
   or die('Fehler: '.mysql_error());
?>
</pre>
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany


Return to PHP

Who is online

Users browsing this forum: No registered users and 2 guests