Ik heb een tabel waarin ik groepen opsla. De tabel heeft bijv. de volgende velden:
id - nummertje van de groep
pid - nummertje van de bovenliggende groep
deleted - groep is verwijderd ja / nee (1 of 0)
Het aantal niveau's is op deze manier eindeloos. Nou wil ik een query maken die een bepaalde groep verwijderd door deleted op 1 te zetten, maar die ook meteen alle groepen die onder dit id vallen aanpast. Dit zou kunnen door bijvoorbeeld onderstaande te doen (voorbeeld met groep 23):
<?php
$query = '
UPDATE tabel
SET deleted=1
WHERE id=23 OR pid=23
';
?>
Maar, probleem is dat hij nu alleen de groep zelf, en de groepen die hier direct onder vallen verwijderd. Is het ook mogelijk om in 1 query ook de groepen die in de niveau's hieronder vallen te verwijderen??????
Wellicht kun je uit de voeten met een inner-foreignkey, dan regelt de database dit keurig voor jouw.
Anders kun je wellicht een TRIGGER instellen die het werk voor jou verricht. Daar heb je (bij mijn weten) wel minimaal MySQL versie 5 voor nodig, of nog beter, PostgreSQL.
Bedankt voor je reactie Frank! Gaf genoeg input om keywords te hebben voor Google ;-) Wat betreft PostgreSQL, ben ik met je eens... Nadeel is alleen dat onze servers momenteel geen PostrgeSQL bieden, en de vraag bij onze klanten vooral de 'makkelijke standaard' vraagt...
Het zoeken op Google leverde vooral zaken op rond performance problemen met recursive queries... Heb het dus met PHP opgelost... Hieronder de code voor het geval iemand anders dit ook zoekt, of voor het geval mensen de neiging hebben het af te schieten :-)
<?php
$table = 'tabel';
$ids = '';
/**
* Deze loop selecteert alle groepen waarvan de parent verwijderd is.
* Hierna update hij de tabel met deleted=1 voor al deze groepen
*
* Zolang het aantal geupdate rijen groter is dan 0 blijft de loop actief
*/
do {
// Alle id's selecteren waarvan de parent verwijderd is
$query = ' SELECT pid AS parent, uid
FROM ' . $table . '
WHERE (
SELECT COUNT(uid)
FROM ' . $table . '
WHERE uid=parent AND deleted=1
) > 0
';
$result = @mysql_query($query, $cid) or die (mysql_error());
while ($row = @mysql_fetch_object($result)) {
$ids .= $row->uid . ',';
}
// Laatste komma strippen
$ids = preg_replace('/,$/', '', $ids);
// Alle geselecteerde groepen verwijderen
$query = ' UPDATE ' . $table . '
SET deleted=1
WHERE uid IN(' . $ids . ')
';
$result = mysql_query($query, $cid) or die (mysql_error());
} while (mysql_affected_rows() > 0);
?>
Nadeel is alleen dat onze servers momenteel geen PostrgeSQL bieden, en de vraag bij onze klanten vooral de 'makkelijke standaard' vraagt...
1) Kwestie van downloaden en installeren
2) Kwestie van aanbieden/verkopen, zie Yapf.net voor de argumenten om MySQL af te zweren en ritueel te verbranden... ;)
PostgreSQL is eenvoudiger dan MySQL, de 'makkelijke staandaard' zou dus PostgreSQL als antwoord moeten opleveren. Met MySQL kan er gewoon teveel fout gaan zonder dat je het zelf doorhebt. Fout gebruik van GROUP BY blijft altijd een mooi voorbeeld, MySQL verzint dan zelf wat jij misschien wel als resultaat zou willen hebben. Dit kan per keer echter verschillen...
Vraag en aanbod zijn altijd nauw met elkaar verbonden. Geen aanbod, dan ook geen (of weinig) vraag. Wél aanbod, dan komt er vanzelf vraag naar. Tenminste, wanneer het een goed product betreft.