WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Select top...typ (https://www.wn.se/forum/showthread.php?t=2861)

ZN 2004-07-21 22:47

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..

zoran 2004-07-22 12:05

Citat:

Originally posted by Bitbull@Jul 21 2004, 22:47
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..

Min första tanke var att göra:

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

WizKid 2004-07-22 13:20

Kan du inte bara vända på resultatet i PHP eller vad för språk du använder?

SkyNet 2004-07-22 13:22

Citat:

Originally posted by zoran@Jul 22 2004, 12:05
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 :)

Ännu enklare och mindre belastning är ju att bara plocka ut de tio rader man vill ha och sedan själv ändra ordningen på raderna. Använder man PHP så hämtar man resultatet i form av en array med mysql_fetch_array() och sedan kan man använda mysql_data_seek() för att börja i fel ände och skriva ut datan bakifrån (dvs nyast längst ner) ... Slipper man två queries.

jahaa 2004-07-22 13:40

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>";
}

:)

ZN 2004-07-22 15:35

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?

ZN 2004-07-22 15:59

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'];
}

Tar lite extra av servern att bearbeta jämfört med att få det direkt av mysql men
det bör nog inte va någon fara.

jahaa 2004-07-22 16:02

Den fungerar likadant som min kodsnutt =)

nallebjorn 2004-07-22 19:41

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)

mbomelin 2004-07-23 11:01

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


Alla tider är GMT +2. Klockan är nu 02:23.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson