Om du inte har några rader där count < 0 kanske detta fungerar:
SELECT * FROM links ORDER BY count ASC, time ASC
/Csson
------------------
Erimax.com
Cykelsemester
[Redigerat av Csson den 17 nov 2001]
Databaser & SQLur Databashanterare & SQL
13 svar · 247 visningar · startad av Rocket
Nu ordnar jag det som hämtat från databasen efter tiden, med den här raden:
mysql_query("SELECT * FROM links ORDER BY time”)
Men jag vill lägga till att om count=0 så ska dessa läggas först. Kan man göra det direkt i ”queryn”? Det ska alltså vara så att alla som har count=0 ska komma först sorterade efter time. Efter det så ska alla andra komma sorterade efter time.
Går detta att fixa i en query? Jag vet att det inte är svårt att fixa i flera men går det i en?
Om du inte har några rader där count < 0 kanske detta fungerar:
SELECT * FROM links ORDER BY count ASC, time ASC
/Csson
------------------
Erimax.com
Cykelsemester
[Redigerat av Csson den 17 nov 2001]
Nej det blir fel. Enligt det du skrev så sorterar den i första han efter count, alltså först count=0 sen =1 =2 o.s.v. Jag vill alltså ha det så att count=0 kommer först sedan ska bara time spela roll, alltså.
SELECT * FROM links ORDER BY count (if count=0), time
Vad betyder ASC ?
[Redigerat av Rocket den 17 nov 2001]
SELECT * FROM links ORDER BY case when count = 0 then 0 else 1 end ASC, time ASC
ASC är en förkortning av ascending, dvs stigande
Du kan ange DESC (descending) för att få sorteringen i fallande ordning.
OT: Count är inget bra namn då det är ett reserverat ord i många SQL-dialekter
------------------
essentitia preter non sans multiplicandum
Kan man få en förklaring för raden:
case when count = 0 then 0 else 1 end
Kan man göra så att när count=0 så sorteras time med nyaste först men näst count!=0 så är den nyaste sist?
Tja, det fungerar som en funktion, om uttrycket count = 0 är sant så returneras värdet 0 annars 1
Vilken datatyp är time ? Om det är ett datum så borde det bli något så här.
order by case when count = 0 then 0 else 1 end asc, case when count = 0 then time else '0000-00-00' end desc,
case when count = 0 then '9999-12-31' else time end asc
------------------
essentitia preter non sans multiplicandum
Då fortsätter jag att använda två querys, det blir ju betydligt mycket lättare att skriva så i alla fall.
Vad som är bäst beror på vad du gör. Jag kan inte säga så mycket utan att se koden.
------------------
essentitia preter non sans multiplicandum
Alternativ 1:
$result = mysql_query("SELECT * FROM links WHERE count='0' ORDER BY time DESC") OR DIE(mysql_error());
while($rad = mysql_fetch_array($result)){
echo "<a href=\"$PHP_SELF?id=$rad[id]&go=1&url=$rad[url]&\" target=\"_blank\">$rad[name]</a><br>\n";
}
$result = mysql_query("SELECT * FROM links WHERE count!='0' ORDER BY time") OR DIE(mysql_error());
while($rad = mysql_fetch_array($result)){
echo "<a href=\"$PHP_SELF?id=$rad[id]&go=1&url=$rad[url]&\" target=\"_blank\">$rad[name]</a><br>\n";
}
Alternativ 2:
$result = mysql_query("SELECT * FROM links order by case when count = 0 then 0 else 1 end asc, case when count = 0 then time else '00000000000000' end desc, case when count = 0 then '99991231000000' else time end asc") OR DIE(mysql_error());
while($rad = mysql_fetch_array($result)){
echo "<a href=\"$PHP_SELF?id=$rad[id]&go=1&url=$rad[url]&\" target=\"_blank\">$rad[name]</a><br>\n";
}
Ok då vinner du :)