IP Adressen Datenbank: Mehrfache einträge herausfinden

benurb

Mitglied
Hallo,

Ich bräuchte wohl einen kleinen Denkanstoß.
Ich habe eine Datenbank, die IP Adressen speichert.
Sieht so aus:

IP // Gruppe
11.11.11.11 // 1
22.11.11.11 // 1
33.11.11.11 // 2
33.11.11.11 // 2

Nun möchte ich aus dieser Datenbank alle Einträge herausfinden, die die gleiche IP haben, aber nicht die gleiche Gruppen ID und diese in eine andere Datenbank schreiben.

Ich habe es bisher mit zwei while Schleifen gelöst. In der ersten werden alle Einträge aus dieser Tabelle ausgelesen. In der zweiten (die sich in der ersten Schleife befindet) wird die komplette Tabelle nochmal durchsucht ob es noch weitere Einträge mit derselben IP aber einer anderen Gruppe gibt. Dass zwei While Schleifen ineinander (mit jeweils einer Abfrage) nicht gut für die Auslastung sind, ist mir klar *g*
Seis drum. Diese While Schleifen schreiben dann die Ergebnisse jedenfalls in ein Array.

Dieses Array lese ich mit foreach aus und Schreibe die Werte in die neue Datenbank.
Scriptausführungszeit liegt jetzt bei ca. 1 Minute. Kann man das irgendwie beschleunigen?

Danke im Voraus
 
Zuletzt bearbeitet:
Hallo!

Also "spontan" ist mir folgende, noch zu testende Lösung eingefallen:

PHP:
<?php
$ip_gid	= array();
$to_move= array();
$query	= mysql_query("SELECT * FROM $table ORDER BY Gruppe ASC");
while($row = mysql_fetch_assoc($query)) {
	$ip_gid[$row['IP']] = $row['Gruppe'];
}

foreach($ip_gid as $ip => $gruppe) {
	foreach($ip_gid[$ip] as $gid) { // alle eintraege mit der gleich ip raussuchen
		if($gid != $gruppe) {
			$to_move[$ip] = $gruppe; // ggf in $gid aendern [$gid ist immer hoeher als $gruppe!]
		}
	}
}
// mal ein bisschen speicher freigeben :)
unset($ip_gid);

$query = "INSERT INTO $table2 (IP,Gruppe) VALUES ";
$values = array();
foreach($to_move as $ip => $gruppe) {
	$values[] = "('$ip','$gruppe')";
}
$query .= implode(",", $values);
mysql_query($query);
?>

MfG,
Marcel
 
Hi,

das kann man mit einer Gruppierung noch viel einfacher haben. Was genau willst Du eigentlich in die andere Datenbank schreiben? Nur die IP-Adressen, die mehrere Gruppen haben? Alle IP-Adressen, aber ohne Duplikate?
Im ersten Fall gruppierst Du einfach nach IP-Adresse und zählst jeweils die Gruppen (COUNT). Im zweiten Fall ist DISTINCT Dein Freund.
Das kann alles die Datenbank...

LG
 
Wie währe es mit einem CONCAT() um beides aneinander anzuhängen, damit ein GROUP BY?

Also
SQL:
SELECT *, count(*) as cnt FROM ips GROUP BY CONCAT(ip, gruppe)
 
Zurück