Permalänk
Medlem

SQL-optimering

Hej

Nu har jag löst mitt problem (enligt min logik är det här bättre eftersom det är en ny fråga än att posta i den gamla, någon moderator får gärna messa mig och klaga om jag tänker fel) och problemet är att jag måste optimera koden som känns minst sagt klumpig.

Select distinct ta.id, ta.namn, (Select Count([tagg-id]) from [art-tag-rel] atr Where atr.[tagg-id]=ta.id) as antal from taggar ta, texter te, [art-tag-rel] atr where ta.niva=0 and atr.[tagg-id]=ta.id and atr.[artikel-id]=te.id and te.vem=idnummer på person

Koden ovan plockar ut alla poster som en person har gjort och ger:

tagg id , tagg namn, antalet

exempel:
1 Nyheter 10st.
2 Bloggar 4st

Databasen är en relationsdatabas där (taggar) innehåller alla taggars namn, (art-tag-rel) innehåller pekare till alla poster som har en viss tagg och en pekare till taggen i sig. Slutligen (texter) som innehåller alla texter.

Hur skall koden ovan optimeras för hastighet?

Tack på förhand.

Permalänk
Medlem

Jag skulle prova något i den här stilen. Borde gå fortare än att köra en SELECT COUNT för varje träff.

SELECT ta.id, ta.namn, COUNT(*) as antal FROM taggar ta INNER JOIN [art-tag-rel] atr ON ta.id = atr.[tagg-id] INNER JOIN texter te ON te.id = atr.[artikel-id] WHERE ta.niva = 0 AND te.vem = idnummer GROUP BY ta.id, ta.namn

Permalänk
Medlem

Kör det i mysql-prompten så ser du hur lång tid förfrågningen tar.

Permalänk
Medlem

Jag kör windowsserver tyvärr. Kan inte ändra på det i nuläget. Hur som helst, i exemplet ovan, tar inte din generella count och räknar poster i tabellen taggar? Det är posterna i tabellen art-tag-rel som ska räknas. Cyklar jag nu?

Permalänk
Medlem

Du kan ju köra mysql-prompt i cmd ?

Visa signatur

Swec @ 2001 / Chalmerist - Javisst!
'Den som har flest prylar när han dör vinner!'

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av AlfonsA
... Hur som helst, i exemplet ovan, tar inte din generella count och räknar poster i tabellen taggar? Det är posterna i tabellen art-tag-rel som ska räknas. Cyklar jag nu?

COUNT(*) i kombination med GROUP BY-klausulen returnerar antalet förekomster av varje enskild ta.id, ta.namn kombination. Bör bli rätt om jag inte har missförstått vad du vill göra.

Permalänk
Medlem

Nej det blir tyvärr fel. Jag vill ha ut antalet av varje enskilt [art-tag-rel].[tagg-id]. Det är en helt annan tabell.

Varje post i mitt recordset ska se ut såhär:

taggar.id ---- taggar.namn ---- [art-tag-rel].[tagg-id]