FRanziska: Abfrage WHERE kollidiert mit GROUP

Ich habe ein nested Menü mit mysql erstellt.
Doch ich möchte nur die Datensätze ausgeben die den Level 1 haben.
Ich bekomme aber die Abfrage nicht hin

SELECT n.name, COUNT( * ) -1 AS level  
FROM nestedset AS n, nestedset AS p  
WHERE n.lft  
BETWEEN p.lft AND p.rgt  
GROUP BY n.lft  
ORDER BY n.lft  
LIMIT 0 , 30  

Ausgabe:
-----------------------------------------
Start 0
Germany 1
Amerika 1
Austria 2
Italia        2
Roma     3

Franzi

  1. Hallo, dir fehlt ein HAVING COUNT(*) .... ;-)

    1. Hallo, dir fehlt ein HAVING COUNT(*) .... ;-)

      SELECT n.name, COUNT( * ) -1 AS
      LEVEL
      FROM nestedset AS n, nestedset AS p
      WHERE n.lft
      BETWEEN p.lft
      AND p.rgt
      GROUP BY n.lft
      HAVING COUNT( * ) =2
      ORDER BY n.lft

      Ne das war aber einfach (wenn man drauf kommt)

      Danke.

      Franzi (die noch viele Fragen hat)

      1. Ich habe zwei SELECT Abfragen, ist es möglich wegen der Performence die beiden Abfrage zu einer zusammenzufassen und so das ganze auch noch schneller zu machen?

        1 Select Abfrage:

        SELECT n.name,n.lft,n.rgt, COUNT( * ) -1 AS LEVEL  
        FROM nestedset AS n, nestedset AS p  
        WHERE n.lft  
        BETWEEN p.lft  
        AND p.rgt  
        GROUP BY n.lft  
        HAVING COUNT( * ) =2  
        ORDER BY n.lft  
        
        

        2 Select Abfrage:

        SELECT Name FROM nestedset p WHERE lft>'$main->lft' AND rgt<'$main->rgt' ORDER BY lft";

        In der ersten Frage ich die Hauptkategorien ab, und in der zweiten gebe ich die dazugehörigen Unterkategorien dann in einer Schleife aus.

        Komplett mit php code:

          
        $sql =  "SELECT n.name,n.lft,n.rgt, COUNT( * ) -1 AS LEVEL  
        FROM nestedset AS n, nestedset AS p  
        WHERE n.lft  
        BETWEEN p.lft  
        AND p.rgt  
        GROUP BY n.lft  
        HAVING COUNT( * ) =2  
        ORDER BY n.lft";  
          
        $result = mysql_query($sql)or die($sql.'<br>'.mysql_error());  
          
        while ($main = mysql_fetch_object($result))  
        	{  
        	  
        		echo $main->name.'<br>';  
          
        		$sql =  "SELECT Name FROM nestedset p WHERE lft>'$main->lft' AND rgt<'$main->rgt' ORDER BY lft";  
        		$result2 = mysql_query($sql)or die($sql.'<br>'.mysql_error());  
          
        		while ($main2 = mysql_fetch_object($result2))  
        			{  
        			echo $main2->Name.', ';  
        			}  
          
        		echo '<br><br>';  
          
        	}
        
        1. Hallo,

          naja, dann frag doch einfach ohne die Beschränkung auf Level 1 ab und lass dir lediglich das Level mit ausgeben (wie du ja eh schon tust). Und ausserhalb der Datenbank in PHP wo du ja eh schon eine Schleife brauchst, kannst du ja einfach den Wert für Count auswerten (IF THEN ELSE und so). Ich nehme an, dass die Unterkategorien etwas eingerückt werden sollen? Das kannst du kontrollieren indem du in Abhängigkeit von dem Wert für Count eine CSS Klasse mit angibst. Oder so.

          Cheers, Frank

  2. moin,

    SELECT n.name, COUNT( * ) -1 AS level

    FROM nestedset AS n, nestedset AS p
    WHERE n.lft
    BETWEEN p.lft AND p.rgt
    GROUP BY n.lft
    ORDER BY n.lft
    LIMIT 0 , 30

      
    mal von dem problem abgesehen, hier noch ein paar hinweise von mir.  
      
    - lass AS weg, es ist erstens nur optional und zweitens nicht alle DBMS unterstützen diese schreibeweise in dieser form bei den tabellen. zweitens bläst es den code meiner meinung nur auf. aber letzteres ist sicherlich auch geschmackssache.  
      
    - benutze die explizite join schreibweise, auch bei einen selfjoin.  
      
    - du grupppierst über die spalte n.lft, gibst aber in der ausgabe (projektion) die spalte n.name aus. dies ist ein bug von mysql, jedes andere dbms würde dir eine fehlermeldung ausgeben. und nein, es ist kein feature...  
      
    Ilja