kostenloser Webspace werbefrei: lima-city


Brauche Denkanstoß für MySQL-Zählroutine

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fatfreddy

    Kostenloser Webspace von fatfreddy

    fatfreddy hat kostenlosen Webspace.

    Moin!

    Stehe irgendwie auf der Leitung und grüble schon den halben Tag über meinem Problem.

    Ich habe ein älteres Skript , das ich etwas ausbauen möchte.
    In der Datenbank gibt es zwei, das Problem betreffende Tabellen, eine für Kategorien und eine für Artikel.

    "Categories" mit den Feldern: Cat_ID, Cat_Name, Cat_Parent_ID...

    "Pages" (für die Artikel) mit den Feldern: Page_ID, Page_Name, Page_Cat_ID,...

    Die Kategorien bilden eine Baumstruktur. Kategorien und Artikel können beliebig verschoben, hinzugefügt und gelöscht werden. Das Feld "Cat_Parent_ID" gibt Auskunft über die jeweils übergeordnete Kategorie.

    Auf der Webseite werden, beim Betrachten einer Kategorie, die direkt untergeordneten Kategorien und die der aktuellen Kategorie zugehörigen Artikel gezeigt.

    Gewünscht ist nun, neben den Kategorienamen die Anzahl ALLER Beiträge ALLER untergordneten Kategorien zu zeigen.

    Und damit hänge ich in der Luft. Die Anzahl der Einträge in einer Kategorie zu ewrmitteln, ist kein Thema, aber eine resourcensparende Möglichkeit, mich durch den gesamten Kategoriebaum zu hangeln und die Summe aller Einträge unterhalb eines Knotens zu ermitteln, will mir nicht einfallen.

    Hat da jemand einen Vorschlag?


    FF






    Beitrag zuletzt geändert: 9.2.2010 16:22:55 von fatfreddy
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    Also mit PHP ginge das relativ leicht, wenn auch nicht ressourcensparend. Mit MySQL hast du das Problem, dass du eine unendliche Child-Tiefe benötigst, die mit diversen Conditionals realisierbar wäre. Da weiss ich aber nicht genau, wie das umzusetzen ist, also versuch ichs mal mit ner PHP-Lösung:

    <?php
    
    	$matchID = array();
    
    	function getChildCats($cat_id)
    	{
    		$query = mysql_query("SELECT `Cat_ID` FROM `Categories` WHERE `Cat_Parent_ID` = '".$cat_id."' ");
    
    		while($result = mysql_fetch_assoc($query))
    		{
    			global $matchID;
    			
    			$matchID[] = $result['Cat_ID'];
    			
    			$subquery = mysql_query("SELECT `Cat_ID` FROM `Categories` WHERE `Cat_Parent_ID` = '".$result['Cat_ID']."' ");
    			
    			if(mysql_num_rows($subquery))
    			{
    				getChildCats($result['Cat_ID']);
    			}
    		}
    
    	}
    	
    	// alle zutreffenden kategorien erfassen
    	
    	getChildCats($SEARCH_ID);  //  $SEARCH_ID muss die ID des höchsten Parent enthalten!
    	
    	// matchID enthält nun alle IDs, die in der Baumstruktur zutreffen
    	
    	$whereclause = '(1=2 OR ';
    	
    	foreach($matchID as $id)
    	{
    		$whereclause .= "`Cat_ID` = '".$id."' OR ";
    	}
    	
    	$whereclause = substr($whereclause, 0, -4).")";
    	
    	// die generierte WHERE-Bedingung trifft nun auf alle ermittelten IDs zu. Der initialwert verhindert einen Syntax-Fehler, falls $matchID leer ist.
    	
    	$result = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS `Anzahl` FROM `Pages` WHERE ".$whereclause));
    	
    	$countPages = $result['Anzahl'];
    	
    	// $countPages enthält nun die Anzahl aller Artikel. Fertig.
    	
    ?>


    Das funzt und ist mit bis zu 1000 Artikeln auch noch relativ schnell. Mit reinem MySQL, wäre es sicherlich noch schneller, aber wie gesagt kenne ich mich da nicht genug mit aus.

    Liebe Grüße
    - VampireSilence
  4. MySQL unterstützt afaik keine Rekursion.

    Hier ist ein interessanter Ansatz, der dein Problem lösen könnte: Unter "Nested Set" zu finden. Das ganze würde jedoch eine völlig neue Datenbankstruktur erfordern, ich weiß nicht, ob du dir das antun willst.
  5. Autor dieses Themas

    fatfreddy

    Kostenloser Webspace von fatfreddy

    fatfreddy hat kostenlosen Webspace.

    @vampiresilence:

    In ähnlicher Form hatte ich es auch schon versucht und verworfen, aber deine Lösung ist durch die geschickt gebaute Whereclause um Längen schneller und funktioniert perfekt. :thumb:
    Geschwindigkeitsprobleme gibt es nur bei der Anzeige von Kategorien mit vielen direkten Unterkategorien. Da muß die Abfrage leider für jede Unterkategorie einzeln laufen.

    Ich werde sie wohl trotzdem in dieser Form übernehmen und entweder die Queries cachen, oder mit einer Hilfstabelle arbeiten, die nur bei Änderungen neu aufgebaut wird.
    Bisher habe ich es mit 130 Kategorien und ca. 900 Artikeln testen können. Werde gleich mal versuchen, die Datenbank auf ein Mehrfaches zu vergrößen und schauen, wie es sich dann verhält.

    @nikic: Nested Sets zu nutzen wäre sicherlich das optimale Vorgehen. Aber Du hast Recht, ich möchte, zumindest im Moment, nicht die ganze Struktur umbauen, das Script ist an zu vielen Stellen im Einsatz.
    Werde mich aber trotzdem mal intensiver mit dem Thema beschäftigen. Verwendungsmöglichkeiten dafür gibt es ja genug.. :wink:

    Herzlichen Dank an euch beide.


    FF

  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!