webForumDet fria alternativet

Hur räknar jag enbart kategorier som har en parent, men som inte är en parent?

Databaser & SQL

7 svar · 1 477 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

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! :)

Medlem sedan juni 201161 inlägg
#2

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)
Medlem sedan nov. 20016 480 inlägg
#3

Klockrent :D Funkade prima! Tack!

Medlem sedan aug. 20039 340 inlägg
#4

Hur var det nu med prestandan på en sån fråga igen?

Medlem sedan juni 201161 inlägg
#5

nitro2k01 skrev:

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.

Medlem sedan nov. 20016 480 inlägg
#6

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!

Medlem sedan juni 201161 inlägg
#7

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?

Medlem sedan nov. 20016 480 inlägg
#8

Exakt 147, varav 27 är is_parent och kommer inte att ändras så det borde vara under kontroll. :)

260 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)