En enkel subselect fixar ju det:
SELECT COUNT(*) as totalfound
FROM table as t
WHERE t.parent > 0
AND NOT EXISTS(SELECT * FROM table WHERE parent = t.id)
7 svar · 1 477 visningar · startad av bassebhu
Hej alla glada!
Jag har en databas som ser ut så här:
id - parent - title
Huvudkategorier (och kategorier om det inte finns någon huvud/underkategori för aktuell kategori) får värdet 0 i 'parent'
Underkategorier och kategorier får sin parents id i 'parent'
Nu vill jag köra en sql-fråga som räknar hur många kategorier det finns, men utesluter huvud och underkategorier. Jag har bara tre nivåer om det är av vikt. Jag vill alltså räkna alla kategorier som befinner sig längst ut i trädet och då som sagt även om en kategori inte har någon parent. Det viktigaste är att den inte har några barn :)
$sql = "SELECT COUNT(*) as totalfound
FROM table
WHERE [b]DONT HAVE CHILDREN[/b]"
Idéer? Går detta att göra på nåt enkelt sätt utan att behöva loopa igenom allt för varenda post? Tack! :)
En enkel subselect fixar ju det:
SELECT COUNT(*) as totalfound
FROM table as t
WHERE t.parent > 0
AND NOT EXISTS(SELECT * FROM table WHERE parent = t.id)
Klockrent :D Funkade prima! Tack!
Hur var det nu med prestandan på en sån fråga igen?
Hur var det nu med prestandan på en sån fråga igen?
Det blir ju förmodligen en Table Scan, men knappast värre än så. Det är ju en ganska kompakt tabell, så det borde inte bli så många fysiska läsningar.
Nu pratar ju jag utifrån hur det fungerar i SQL Server, men där ser jag inget stort problem med den.
Jag lade dock till ett fält som heter is_parent som löste massa andra problem så nu kan jag bara räkna där is_parent = 0. Ännu bättre prestanda!
Jo, en denormalisering kan ju ofta ge bättre prestanda. Men du betalar ju med att du nu har möjliga inkonsistenta tillstånd (is_parent = 0 trots att EXISTS(SELECT * FROM table WHERE parent = t.id) och vice versa). Du behöver nu med kod någonstans säkerställa att is_parent hela tiden är korrekt på varje post.
Frågan är ju om det behövs. Exekveringstiden är i stort sett linjär mot antalet poster i tabellen, så det känns inte som om du behöver denormalisera. Hur många poster räknar du med att tabellen kommer att innehålla? 10000? 100000? En miljon?
Exakt 147, varav 27 är is_parent och kommer inte att ändras så det borde vara under kontroll. :)