2 Selects vergleichen und in Array speichern

LarsHH

Mitglied
Hallo zusammen,
ich habe 2 Selects: Im ersten werden alle Personen ausgelesen, im zweiten werden die gelöschten ausgelesen.
Anschließend werden die gelöschten rausgenommen. (Das ganze ist nur ein Beispiel, daher etwas schwachsinnig, da man das auch mit einem einfachen Select regeln könnte)
Mein eigentliches Problem ist, dass ich in meinen $result Array jetzt immer nur die Werte für p_id habe. Ich möchte aber sowohl p_id als auch nachname in dem Array haben.
Was muss ich dafür umstellen?

PHP:
$query1="SELECT p_id, nachname FROM person";
$abfrage1=mysql_query($query1);
while($array1 = mysql_fetch_array($abfrage1)) {
  	$alle[] = $array1['p_id'];
}

$query2="SELECT p_id, nachname FROM person WHERE geloescht='1'";
$abfrage2=mysql_query($query2);
while($array2 = mysql_fetch_array($abfrage2)) {
  	$geloescht[] = $array2['p_id'];
}

$result = array_diff_assoc($alle, $geloescht);

foreach($result as $vergleich)
print_r($vergleich."<br>");
 
Wozu zwischenspeichern? Du willst die gelöschten aus der DB schmeißen?
PHP:
$query2="DELETE FROM person WHERE geloescht='1'";


Dein Array für die Information Nachname etc. ist ein mehrdimensionales Array

PHP:
$query1="SELECT p_id, nachname FROM person";
$abfrage1=mysql_query($query1);
while($data= mysql_fetch_array($abfrage1)) {
      $alle[] = array($data['p_id'], $data['nachname']);
}
 
Zuletzt bearbeitet:
Ok ich habe jetzt ein weiteres Problem:
PHP:
$result = array_diff_assoc($alle, $geloescht);
Dies sollte eigentlich die Einträge aus dem Array löschen, welche in $alle und in $geloescht stehen. Es wird auch die richtige Anzahl an Werten gelöscht. Jedoch werden, wenn es z.B. 10 Übereinstimmungen gibt, einfach die ersten 10 Werte gelöscht und nicht die wirklich übereinstimmenden.
Das kann doch irgendwie nicht sein.
Kann jemand bei der Lösung des Problems helfen?
 
Du hast hier kein assoziatives Array. Funktioniert diese Funktion so überhaupt?

Aber ich muss nochmal fragen..auch wenn es nur ein Beispiel ist. Warum so umständlich?!
 
Ok, ich kann das ganze ja mal etwas genauer erklären:
Ich habe eine Tabelle mit allen Personendaten:
p_id, nachname...
Dann habe ich eine Tabelle wo für einige wenige Personen ein Status zugeordnet ist.
p_id, status...
Ich benötige eine Abfrage, welche alle Personen ausgibt, welche entweder keinen Eintrag in der Statustabelle haben oder einen Eintrag in der Statustabelle haben dessen Wert nicht X ist.
Soweit ich herausgefunden habe ist dafür eigentlich der LEFT OUTER JOIN die richtige Wahl. Mit dem Teil braucht meine Abfrage aber über 10 Minuten.
Also suche ich erst alle Personen aus der Personentabelle mit einer Abfrage. Suche dann die Personen über eine Abfrage welche den Wert X im Status haben und ziehe diese Personen von meiner ersten Abfrage ab. Damit geht das ganze sehr sehr viel schneller.

Ich versuche es jetzt nochmal ohne assoc. Bisher bekam ich bei der Ausgabe dann immer nur "Array" angezeigt, aber dann muss ich die Ausgabe wohl wieder irgendwie anpassen.
Ich melde mich bei Erfolg oder Verzweiflung ;-)

edit:
Also wenn ich das assoc weglasse, bekomme ich bei print_r($result); als Ausgabe nur "Array ()"
Scheint also leer zu sein!?
 
Zuletzt bearbeitet:
Klar zeigt Dir die Ausgabe ein Array. Es ist ja auch ein Array im Array = mehrdimensional.

Mach mal
PHP:
print_r($alle);
das hilft zur Veranschaulichung.

Aber Deine Anforderung müsste man ohne Probleme mit der passenden SQL Query lösen können. Mit Sicherheit auch performanter als 10 Min. Vielleicht mal im SQL Bereich nachfragen.
 
Zuletzt bearbeitet:
Bei print($alle) bekomme ich eine Ausgabe wie ich sie erwarte.
Bei print($result) bekomme ich nichts. Ich habe bisher wenig mit Arrays gearbeitet, vielleicht stell ich mich auch einfach zu blöd an. Wie kann ich mir das denn ausgeben lassen?
Bevor ich das 'assoc' wegenommen habe, klappte die Ausgabe über:
PHP:
foreach( $result as $host => $value ) { 
	$content = $host; 
	foreach( $value as $foo => $bar ) { 
		echo $content=$bar."<br>"; 
	} 
}
jetzt kommt dabei nichts mehr raus.
Ich habe im SQL Forum auch nochmal nach einer Alternative zu dem viel zu langsamen left outer join gefragt. (Ich glaube aber eigentlich nicht an eine sql lösung meines Problems)
 
Zurück