Kom ihåg mig?
Home Menu

Menu


Select top...typ

 
Ämnesverktyg Visningsalternativ
Oläst 2004-07-21, 23:47 #1
ZNs avatar
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Apr 2003
Inlägg: 1 214
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
ZNs avatar
 
Reg.datum: Apr 2003
Inlägg: 1 214
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..
ZN är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-22, 13:05 #2
zorans avatar
zoran zoran är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 598
zoran zoran är inte uppkopplad
Mycket flitig postare
zorans avatar
 
Reg.datum: Jun 2004
Inlägg: 598
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
zoran är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-22, 14:20 #3
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
Kan du inte bara vända på resultatet i PHP eller vad för språk du använder?
WizKid är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-22, 14:22 #4
SkyNet SkyNet är inte uppkopplad
Validating
 
Reg.datum: Apr 2004
Inlägg: 99
SkyNet SkyNet är inte uppkopplad
Validating
 
Reg.datum: Apr 2004
Inlägg: 99
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.
SkyNet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-22, 14:40 #5
jahaa jahaa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2004
Inlägg: 91
jahaa jahaa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2004
Inlägg: 91
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>";
}
jahaa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-22, 16:35 #6
ZNs avatar
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Apr 2003
Inlägg: 1 214
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
ZNs avatar
 
Reg.datum: Apr 2003
Inlägg: 1 214
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-22, 16:59 #7
ZNs avatar
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Apr 2003
Inlägg: 1 214
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
ZNs avatar
 
Reg.datum: Apr 2003
Inlägg: 1 214
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.
ZN är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-22, 17:02 #8
jahaa jahaa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2004
Inlägg: 91
jahaa jahaa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2004
Inlägg: 91
Den fungerar likadant som min kodsnutt =)
jahaa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-22, 20:41 #9
nallebjorn nallebjorn är inte uppkopplad
Nykomling
 
Reg.datum: Mar 2004
Inlägg: 41
nallebjorn nallebjorn är inte uppkopplad
Nykomling
 
Reg.datum: Mar 2004
Inlägg: 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)
nallebjorn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-07-23, 12:01 #10
mbomelin mbomelin är inte uppkopplad
Medlem
 
Reg.datum: Feb 2004
Inlägg: 248
mbomelin mbomelin är inte uppkopplad
Medlem
 
Reg.datum: Feb 2004
Inlägg: 248
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
mbomelin är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 15:41.

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