verwijderen van een tree in een database

  • Onderwerp starter Onderwerp starter wake
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

wake

Gebruiker
Lid geworden
21 aug 2007
Berichten
195
Hallo,

ik heb een tree in mijn database, dat wil zeggen dat ze allemaal onder elkaar hangen.

en nou wil ik dat op het moment dat met php een record verwijderd word alle records die onder dat record hangen verwijderd worden, maar dus ook de records onder de records die eronder hangen enzovoorts.

nu heb ik het zoals hieronder gedaan, maar dit tot hij nu dus maar tot 10 stappen. ik vroeg me af of er een manier van opbouw is met fors en whiles om de zorgen dat hij oneindig blijft kijken of er een record onder het record hangt en verwijderd..


de database:
id under name

waarbij dus bij het velt 'under' het 'id' staat ingevuld van het record waar hij onder hangt..

kan iemand mij helpen met de opbouw? precies de codes hoeft niet..

PHP:
	$query1 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $p_argument . "'");
	
	while ($row1 = mysql_fetch_assoc($query1)){
		
			$query2 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row1['id'] . "'");
	
			while ($row2 = mysql_fetch_assoc($query2)){
				
				$query3 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row2['id'] . "'");
	
				while ($row3 = mysql_fetch_assoc($query3)){

					$query4 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row3['id'] . "'");
	
					while ($row4 = mysql_fetch_assoc($query4)){

						$query5 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row4['id'] . "'");
	
						while ($row5 = mysql_fetch_assoc($query5)){

							$query6 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row5['id'] . "'");
	
							while ($row6 = mysql_fetch_assoc($query6)){

								$query7 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row6['id'] . "'");
	
								while ($row7 = mysql_fetch_assoc($query7)){

									$query8 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row7['id'] . "'");
	
									while ($row8 = mysql_fetch_assoc($query8)){

										$query9 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row8['id'] . "'");
	
										while ($row9 = mysql_fetch_assoc($query9)){

											$query10 = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $row9['id'] . "'");
	
											while ($row10 = mysql_fetch_assoc($query10)){

												$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row10['id'] . "'");
											}
											
											$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row9['id'] . "'");
										}
										
										$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row8['id'] . "'");
									}
									
									$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row7['id'] . "'");
								}
								
								$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row6['id'] . "'");
							}
							
							$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row5['id'] . "'");
						}
						
						$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row4['id'] . "'");
					}
					
					$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row3['id'] . "'");
				}
				
				$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row2['id'] . "'");
			}
		
		$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $row1['id'] . "'");
	}
	
	$del_query = mysql_query("DELETE FROM " . $_SESSION['s_domain'] . "_template_build WHERE id='" . $p_argument . "'");
 
t is me zelf al gelukt.. voor de gene die nog ooit een tree willen verwijderen:

PHP:
	function delete_tree($id) {
		$q = mysql_query("SELECT id FROM " . $_SESSION['s_domain'] . "_template_build WHERE under='" . $id . "'");

		while($row = mysql_fetch_assoc($q)) {
			delete_tree($row['id']);
		}

		mysql_query('DELETE FROM ' . $_SESSION['s_domain'] . '_template_build WHERE id = ' . $id);
	}
	
	delete_tree($p_argument);
 
Het script in je eerste post ziet er zeer omslachtig uit.
Volgens mij werkt een treeview altijd met een parent en een child.

Dat kan met 1 tabel.
De structuur zal er dan in de basis zoiets uitzien.

id - INT(11) - auto_inc - primary
parent - INT(11)
name - VARCHAR(50)


Waarbij de "root" parent "0" is en de rest bevat een ID uit de tabel zelf.
Grafisch gezien zal het dan zo zijn:
  • id = 1 / parent = 0
  • id = 2 / parent = 0
    • id = 4 / parent = 2
    • id = 5 / parent = 2
  • id = 3 / parent = 0
Verwijder je dan iets kun je gewoon
PHP:
$parentDelQuery = "DELETE id, parent, name FROM tabel WHERE id = '". $id ."'";
$childDelQuery = "DELETE id, parent, name FROM tabel WHERE parent ='". $id ."'";

Is $id dan 2 dan haalt ie meteen alle children weg :)
 
ja dat had ik in eerste instantie ook bedacht, ik heb alleen ook weer een child onder de child enzovoorts. en dat moet oneindig lang door kunnen gaan.. daarom zoon script..

toch thanks!:)
 
Wat is het probleem?

  • id = 1 / parent = 0
  • id = 2 / parent = 0
    • id = 4 / parent = 2
      • id = 6 / parent = 4
      • id = 7 / parent = 4
        • id = 8 / parent = 7
        • id = 9 / parent = 7
    • id = 5 / parent = 2
  • id = 3 / parent = 0

Gewoon met dezelfde structuur :)
 
mjah, en als ik nou id 2 verwijder moet de rest eronder ook verwijderd worden.. dus meer dan 1 child moet weg..
 
Ah kijk, ik zie waar het probleem ontstaat.

Dan is die recursieve functie inderdaad de juiste oplossing :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan