webForumDet fria alternativet

En viss posts sorteringsnummer?

Databaser & SQL

10 svar · 353 visningar · startad av bassebhu

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

Hej alla glada!

Om jag vill hämta en post och dessutom vill ha reda på vilken placering denna får om jag hade hämtat alla poster sorterat efter ett visst fält... Hur gör jag då på mest optimerade sätt...? Tanken är sedan att använda detta för att hämta en post åt gången snabbt så det ska helst inte vara en alltför krävande kodsnutt. (man klickar för att få nästa post alltså...)

Jag tänkte om man kunde pilla in nåt i:

$sql = "SELECT * FROM table WHERE id = '".$id."' ORDER BY date LIMIT 0,1";

Jag vill alltså veta vilken placering denna post hade fått om jag hade hämtat alla poster från tabellen.

Går det att lösa med en sql-fråga? Om inte, går det att lösa med två små sql-frågor? ;)

Tackar för förslag!

Medlem sedan nov. 2000857 inlägg
#2

Tråden flyttas från PHP..

Medlem sedan jan. 20021 122 inlägg
#3

Vet inte hur du ska lösa positionsfrågan, men om sql-satserna ska vara så snabba som möjligt ska du inte använda LIMIT, det ökar tiden som krävs rätt duktigt. Hämta alla och använd mysql_data_seek istället.

Och varför skriver du "... WHERE id = '".$id.'"..." istället för "... WHERE id = $id ..."?

Medlem sedan nov. 20016 480 inlägg
#4

Hur använder jag mysql_data_seek då?

Jag har skrivit '".$id.'" för att jag har hört att det är säkrare med enkelfnuttar runt värdena när man kollar mot databasen. Fel? Och att skriva '$id' funkar ju såklart inte...

Medlem sedan juni 200032 967 inlägg
#5

Apostrofer ska du ha runt värdet om fältet är av strängtyp (varchar / char / text), eller datumtyp. Inte om det är ett talfält. Är inte id-fältet av någon sorts taldatatyp?

Medlem sedan dec. 200012 464 inlägg
#6

men om sql-satserna ska vara så snabba som möjligt ska du inte använda LIMIT

Det ställer jag mig ytterst tveksam till. Vad har du för belägg för det? I vissa fall är det förödande att inte ha med limit.

Medlem sedan nov. 20016 480 inlägg
#7

Jo jag känner till att man inte brukar ha fnuttisar om det är tal, men då någon sa att det var säkrare med fnuttar så har jag kört på det även på tal då det har fungerat, men basseboy byter sätt nu då :)

Medlem sedan nov. 20016 480 inlägg
#8

Ingen som har förslag ang. sorteringen?

Medlem sedan juni 20008 205 inlägg
#9

bassebhu skrev:

Ingen som har förslag ang. sorteringen?

Du borde väl kunna lösa det med en subquery (brasklapp utfärdas, är en aning ringrostig):

SELECT *, (SELECT COUNT(*) FROM table t2 WHERE t2.date > t1.date) AS num_rows_greater 
FROM table t1 WHERE id = någonting ORDER BY date LIMIT 0,1

Sen är subquerys inte direkt det bästa om man vill ha snabba svar, men det är så det är.

Medlem sedan juni 20008 205 inlägg
#10

bassebhu skrev:

Jo jag känner till att man inte brukar ha fnuttisar om det är tal, men då någon sa att det var säkrare med fnuttar

Vill du ha det säker ska du konvertera det till ett tal innan du bakar in det i strängen, så att du inte får med något annat än själva det numeriska värdet. Typ injicerad SQL-kod.

Medlem sedan jan. 20021 122 inlägg
#11

LarsG skrev:

men om sql-satserna ska vara så snabba som möjligt ska du inte använda LIMIT

Det ställer jag mig ytterst tveksam till. Vad har du för belägg för det? I vissa fall är det förödande att inte ha med limit.

Jaså? Det var du som tipsade om det här, så jag prövade och fick resultatet att det tog lite mer än dubbelt så lång tid att hämta 20 rader m.h.a. LIMIT än att hämta alla och sedan söka inom resultatet. Fel?

259 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)