Hui ui ui,,, das klingt ja vernichtend...
Nobbie wrote:Diese Abfrage strotzt vor Fehlern, dass MySQL das überhaupt durchläßt ist eigentlich schon unverständlich. Bei gruppierten Selects kann man nur nach der gruppieren Spalte selektieren und nicht noch nach anderen Spalten, sondern nur nach sog. Aggregatfunktionen der anderen Spalten (MAX(spalte), MIN(spalte), COUNT(Spalte) usw.). Mit anderen Worten:
der Select nach t.id ist vollkommen ungültig (im ANSI SQL ist das ein Abbruchfehler), MySQL führt die Anfrage aus und liefert einen Zufallswert aus. Entweder streiche diese Spalte oder (ich weiß ja nicht, was da hin soll) nimm MAX(t.id) oder MIN(t.id)
Da ich leider nur MySQL habe, gibt es einen strict-mode oder einen validator womit ich sowas zumindest die groben Fehler erwische?
Nobbie wrote:Außerdem solltest Du nicht nach project_id gruppieren, sondern nach n.id, das ist ja auch die selektierte Spalte. Die ORDER Klausel ist dem Zusammenhang auch völlig sinnlos, weil durch die Gruppierung die Reihenfolge belanglos ist. MySQL liefert da möglicherweise zufällig für t.id den gewünschten Wert, aber das SQL ist schlicht falsch.
Das wäre leider auch falsch, ich hätte es viel ausführlicher schreiben sollen. Nach project_id habe ich gruppiert weil dann alle 'Tasks' zu einem Knoten der Navigation table zusammengefasst werden.
Das Order By ergab sich aus der Tatsache das dort im Grunde die parent id's bis zum root gecached werden und ich damit dann tatsächlich die Baumstruktur in der richtigen Reihenfolge sortieren kann.
Nobbie wrote:Wenn die Gruppierung und der Select richtig ist, sollte auch das Ergebnis sich verbessern (dieses "name" habe auch rausgeworfen, was ist das?):
Für das Beispiel war es wirklich nicht wichtig, dort enthalten ist aber der Text, der Name des Navigationspunktes. Im Beispiel ist es wirklich unnötig.
Nobbie wrote:SELECT n.id, COUNT(t.Description)
FROM navigation n LEFT JOIN tasks t
ON n.id = t.project_id
GROUP BY n.id
naja, warum das jetzt nicht klappt habe ich ja oben mehr oder weniger gut darstellen können. Entschuldige bitte die viel zu kurze und nicht vollständige Beschreibung des Problems. Eindeutig mein Fehler - sorry
Mittlerweile habe ich auch eine - zumindest bei MySQL korrekt ausgebende SQL Anweisung gefunden:
- Code: Select all
SELECT id, name, path_text, counted
FROM navigation LEFT JOIN (
SELECT project_id, COUNT(id) AS counted
FROM tasks
GROUP BY project_id) task
ON id = project_id
ORDER BY path
Also, in der inneren Abfrage müsste ich auch das id irgendwie bei der group by Anweisung verwursten, richtig? Oder ist das aufgrund des COUNT doch erlaubt?
Sorry, MySQL ist halt ... Standard irgendwie... (ich meine hier Programmtechnisch, nicht SQL STandard 2003 oder so)
Danke für die bisher aufgeführten Punkte. Ich hoffe das du dir auch weiterhin die Mühe gibst mir zu helfen, auch wenn ich nicht mehr als die paar Pixel bieten kann, die das Wort Danke abbilden.
Liebe Grüße
Emma