FAQ |
Kalender |
2004-07-21, 23:47 | #1 | |||
|
||||
Har WN som tidsfördriv
|
I MySql finns ju tyvärr inte TOP funktionen så nu undrar jag om någon vet ett sätt att få ut de senaste 10 posterna och
sortera dom Ascending utan att göra 2 querys eller subquerys. Såhär ser min query ut nu: SELECT * FROM chat ORDER BY date DESC LIMIT 0,10 Då får jag ut 10 rader med det senaste överst, men jag vill ha det i andra ordningen eftersom det ska skrivas ut som på en irc-chatt. Och jag kan asså inte skriva ASC istället för då får jag inte dom 10 senaste.. |
|||
Svara med citat |
2004-07-22, 13:05 | #2 | |||
|
||||
Mycket flitig postare
|
Citat:
select @count:=count(*) from foo; select * from foo order by date desc limit @count,10; men det går inte. Det går inte att använda variabler i "limit", så du får helt enkelt göra två querys från din applikation. Använder du persistenta uppkopplingar i din applikation borde inte överheaden vara så stor. Sen har jag för mig att man ska kunna speca "limit" globalt att den returnerar max X resultat. Eller om det var Sybase som hade den funktionaliteten. Du får leta i manualaen /Zoran |
|||
Svara med citat |
2004-07-22, 14:20 | #3 | ||
|
|||
Mycket flitig postare
|
Kan du inte bara vända på resultatet i PHP eller vad för språk du använder?
|
||
Svara med citat |
2004-07-22, 14:22 | #4 | ||
|
|||
Validating
|
Citat:
|
||
Svara med citat |
2004-07-22, 14:40 | #5 | ||
|
|||
Medlem
|
denna lilla kod funkar också.
Kod:
$sql = mysql_query("SELECT * FROM chat ORDER BY date DESC LIMIT 0,10"); $i = 1; while($r = mysql_fetch_array($sql)) { $arr[$i] = array("date" => $r['date'], "nick" => $r['nick']); // osvosvosvosv..... $i++; } for($k = 10; $k > 0; $k--) { echo $arr[$k]['date']." ".$arr[$k]['nick']."<br>"; } |
||
Svara med citat |
2004-07-22, 16:35 | #6 | |||
|
||||
Har WN som tidsfördriv
|
Tack för svaren, overheaden blir ju kanske inte så stor men det känns onödigt, det blir nog som ni säger
att jag får använda PHP, men är det inte bara att köra array_reverse() på den? |
|||
Svara med citat |
2004-07-22, 16:59 | #7 | |||
|
||||
Har WN som tidsfördriv
|
Det funkade bra att göra följande:
Kod:
$rev_messages = array(); while($message = mysql_fetch_array($messages)) { $rev_messages[] = $message; } $rev_messages = array_reverse($rev_messages); foreach($rev_messages as $message) { echo $message['message']; } det bör nog inte va någon fara. |
|||
Svara med citat |
2004-07-22, 17:02 | #8 | ||
|
|||
Medlem
|
Den fungerar likadant som min kodsnutt =)
|
||
Svara med citat |
2004-07-22, 20:41 | #9 | ||
|
|||
Nykomling
|
liten parantes:
när det nu gäller bara 10 poster så spelar det nog ingen större roll rent belastningsmässigt om man kör reverse på arrayen eller om man skriver ut arrayen med start från sista elementet... dock om detta ska ske ofta eller med många poster så bör serverbelastningen minska betydligt om man skriver ut den med start från sista elementet (lite beroende på hur php har implementerat arrayer och reverse) |
||
Svara med citat |
2004-07-23, 12:01 | #10 | ||
|
|||
Medlem
|
Man kan ju också skapa en temporär tabell.. lägga in det man ska ha och sedan select:a fråm den tillfälliga med den sortering man vill ha ;D
Då är man riktigt tuff! Skämt åsido... Du behöver inte SELECT:a och lägga i en array och reversa den. Jag vet inte om det blir nån skillnad men jag brukar använda mysql_data_seek() i php. for ($i=mysql_num_rows($res)-1; $i >=0; $i--) { if (mysql_data_seek($res, $i)) { Edit: så efter jag har seek:at så kör jag ju en fetch, t.ex. $row = mysql_fetch_assoc($res) Kanske är en smaksak, jag har faktiskt aldrig funderat på vilket som kräver mest. //M |
||
Svara med citat |
Svara |
|
|