Vi utgår från att jag vet en posts id-värde (värdet i tabellen "id") och att jag vill veta denna posts placering om man skulle lista denna post i en bokstavsordningslista som man listar efter värdet som finns i tabellen "namn". Jag vill bara att man skall räkna med de poster som har samma värde i tabellen "typ som den post jag vill veta placeringen på har i tabellen "typ". Hur gör jag detta? Tror det ska fungera såhär: Detta borde funka bättre? :) <b>Detta borde funka bättre? :) Kanske var lite otydlig eller skrev helt fel. Det är inte två tabeller utan snarere tre kolumner i databasen.poster. Kolumnerna är id, typ och namn. >> Varför är det "bättre"? Johan S. OK häng på det då? jag vet inte hur man skriver detta i SQL-form: <b>jag vet inte hur man skriver detta i SQL-form:</b> <b>Därför att det inte blir fel när det finns dubletter i namn. JohandD:Räkna ut en posts placering om man sorterar efter bokstavsordning
Jag vill alltså inte skriva ut listan utan bara räkna ut vilken placering posten skulle få i en sådan lista.Sv: Räkna ut en posts placering om man sorterar efter bokstavsordning
SELECT COUNT(*) FROM tabell WHERE Namn <= (SELECT Namn FROM Tabell WHERE Id = x)
Tänk på att det blir "fel" när två personer har samma namn...
/JohanSv: Räkna ut en posts placering om man sorterar efter bokstavsordning
SELECT count(*)+1 from Kund
WHERE Namn < (SELECT Namn FROM Kund WHERE id = 8)Sv: Räkna ut en posts placering om man sorterar efter bokstavsordning
SELECT count(*)+1 from Kund
WHERE Namn < (SELECT Namn FROM Kund WHERE id = 8)</b>
Varför är det "bättre"? Det handlar väl mer om hur man vill hantera dubletter i namn. I mitt exempel får alla dubletter den högsta förekomstens placering, i ditt den lägsta. Eller har jag skrivit fel i mitt exempel?
/JohanSv: Räkna ut en posts placering om man sorterar efter bokstavsordning
Det är typ detta jag vill göra:
SELECT count(*)+1 from poster WHERE typ=3 and *räkna bara fram tills kommer till den post där id=X* Order by NamnSv: Räkna ut en posts placering om man sorterar efter bokstavsordning
Därför att det inte blir fel när det finns dubletter i namn.
Tänk dig att det finns flera dubletter, innan "Svensson". Vad händer då? Du hamnar på fel rad.
Dessutom är min SQL snabbare eftersom jag undviker en subquery :)Sv: Räkna ut en posts placering om man sorterar efter bokstavsordning
Sv: Räkna ut en posts placering om man sorterar efter bokstavsordning
*räkna bara fram tills kommer till den post där id=X*Sv: Räkna ut en posts placering om man sorterar efter bokstavsordning
Har du testat mitt eller Olas förslag? Det gör nämligen det förutom tillägget med typ du skrev nu...
JohanD:
SELECT COUNT(*) FROM poster WHERE Namn <= (SELECT Namn FROM poster WHERE Id = 8) AND typ=3
Ola:
SELECT count(*)+1 from poster WHERE Namn < (SELECT Namn FROM poster WHERE id = 8) AND typ=3
/JohanSv: Räkna ut en posts placering om man sorterar efter bokstavsordning
Tänk dig att det finns flera dubletter, innan "Svensson". Vad händer då? Du hamnar på fel rad.</b>
Fel och fel, det är två olika sätt att "räkna" på. Det beror lite på vad man ska använda resultatet till vilken metod man bör använda.
Säg att vi har 5 personer, Andersson, Johansson, Johansson, Johansson och Svensson
Resultatet blir då:
<info>
Ola JohanD
Andersson 1 1
Johansson 2 4
Johansson 2 4
Johansson 2 4
Svensson 5 5
</info>
<b>Dessutom är min SQL snabbare eftersom jag undviker en subquery :)</b>
Hur
SELECT COUNT(*) FROM poster WHERE Namn <= (SELECT Namn FROM poster WHERE Id = 8) AND typ=3
kan ha en extra subquery jämfört med
SELECT count(*)+1 from poster WHERE Namn < (SELECT Namn FROM poster WHERE id = 8) AND typ=3
har jag lite svårt att förstå, men är det något jag missat är jag intresserad av att lära mig det.
/JohanSv: Räkna ut en posts placering om man sorterar efter bokstavsordning
<info>
Ola JohanD
Andersson 1 1
Johansson 2 4
Johansson 2 4
Johansson 2 4
Svensson 5 5
</info>
Position 2 är mer rätt och mer användbart, anser jag :)
(ja det beror på vad man ska ha det till men oftast vill man nog ha den första som matchar)
Ang subquery: nej, du har rätt.. det är ju samma sak (jag funderade över en annan lösning men jag fick inte ihop den och jag har glömt det nu :)