Vinnaren i pepparkakshustävlingen!
2009-11-12, 16:24
  #1
Moderator
Nospheratus avatar
Jag vet inte riktigt hur jag ska beskriva mitt problem utan att dra ett exempel först. Jag har en tabell med olika produkter. Tanken är sedan att jag ska bygga något som påminner om ett binärträd av alla produkterna. Alltså har alla produkter en "förälder" som indikerar vad produkten tillhör. Fältet Parent i min tabell pekar på primärnyckeln ID för sin "förälder". Om Parent är noll innebär det att produkten ligger på rotnivå i trädet och har således ingen förälder. Så här va...

Kod:
ID   Produkt   Parent
1    Frukt     0            <- Produkt på rotnivå
2    Äpple     1
3    Banan     1
4    Päron     1
5    Läsk      0            <- Produkt på rotnivå
6    Fanta     5
7    Sprite    5
8    Cola      5

Nu hade jag då tänkt att hämta antal underprodukter med en query...
Kod:
SELECT ID,Produkt,(SELECT COUNT(*) FROM Tabell WHERE Parent=ID) AS Antal FROM Tabell WHERE Parent=0
Jag hämtar alltså alla produkter vars Parent är 0, produkter på rotnivå alltså. Men jag vill samtidigt hämta antal underprodukter med hjälp av den där subqueryn. Och resultatet jag vill ha är typ...
Kod:
Produkt    Antal
Frukt      3
Läsk       3

Grejen är bra att i subqueryn anger jag ju "WHERE Parent=ID". Och det är ju feltänk av mig, nu kollar queryn efter poster vars Parent=ID, och någon sån post finns ju inte. Fast jag vill ju att den ska jämföra värdet på ID som hämtas i huvudqueryn. Dvs första posten blir "Frukt" vars ID är lika med 1, det är ju det värdet jag vill jämföra Parent med i subqueryn. Går det ens att göra? Eller måste jag köra en query först som bara hämtar produkterna på rotnivå, och sen köra en ny query för varje post i resultatet som hämtar antal underprodukter?
Citera
2009-11-12, 17:16
  #2
Medlem
Mys-Hitlers avatar
Inte rekursivt:

SELECT t2.Produkt, COUNT(*) AS Antal FROM Tabell AS t1 LEFT JOIN Tabell AS t2 ON t1.Parent = t2.ID WHERE t1.Parent <> 0 GROUP BY t1.Parent


Vid fler nivåer skulle jag plocka ut tabellen som den är och greja ihop binärträdet i applikationen istället.
Citera
2009-11-12, 17:22
  #3
Moderator
Protons avatar
En av de bättre beskrivingarna på ett problem och vad man vill åstadkomma, en applåd utdelas för detta

Du vill alltså i praktiken få reda på hur många "frukter" eller "läsk" det finns i din tabell? Funkar det här för det tro?
Kod:
SELECT t1.Produkt,COUNT(t2.Parent) FROM Tabell t1
LEFT JOIN Tabell t2 ON t1.ID = t2.Parent
WHERE t1.Parent = 0
GROUP BY t2.Parent
Nåt sånt?
Citera
2009-11-12, 17:44
  #4
Moderator
Nospheratus avatar
Tackar tackar mina herrar! Fan att jag inte ens tänkte på join, jag tror att jag associerade join till att man har två olika tabeller som man refererar mellan. Men det går ju givetvis att joina fält ur samma tabell.
Citat:
Ursprungligen postat av Proton
En av de bättre beskrivingarna på ett problem och vad man vill åstadkomma, en applåd utdelas för detta
Haha, jo jag satt faktiskt en lång stund och funderade på hur jag skulle formulera mig.
Citera
2009-11-13, 22:34
  #5
Medlem
Citat:
Ursprungligen postat av Mys-Hitler
Vid fler nivåer skulle jag plocka ut tabellen som den är och greja ihop binärträdet i applikationen istället.

Jag har sett den här typen av problem (hitta ett gäng noder i ett träd på något vis) lösas med stored procedures, men den vägen skulle jag nog bara välja om det var bekymmer med begränsad bandbredd mellan databasserver och där applikationen kör.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback