Abfrage WHERE kollidiert mit GROUP
FRanziska
- datenbank
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
Hallo, dir fehlt ein HAVING COUNT(*) .... ;-)
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)
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>';
}
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
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