webForumDet fria alternativet

Order by time if count !=0

13 svar · 247 visningar · startad av Rocket

RocketMedlem sedan feb. 2000372 inlägg
#1

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?

CssonMedlem sedan feb. 2000438 inlägg
#2

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]

RocketMedlem sedan feb. 2000372 inlägg
#3

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]

LarsGMedlem sedan dec. 200012 464 inlägg
#4
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

CssonMedlem sedan feb. 2000438 inlägg
#5

Tänkte inte på det...

/Csson

------------------
Erimax.com
Cykelsemester

RocketMedlem sedan feb. 2000372 inlägg
#6

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?

LarsGMedlem sedan dec. 200012 464 inlägg
#7

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

RocketMedlem sedan feb. 2000372 inlägg
#8

Det funkar bra.

Går det fortare med en lång query istället för två mindre?

LarsGMedlem sedan dec. 200012 464 inlägg
#9

Kanske kanske inte.

------------------
essentitia preter non sans multiplicandum

RocketMedlem sedan feb. 2000372 inlägg
#10

Då fortsätter jag att använda två querys, det blir ju betydligt mycket lättare att skriva så i alla fall.

LarsGMedlem sedan dec. 200012 464 inlägg
#11

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

RocketMedlem sedan feb. 2000372 inlägg
#12

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";
   }
LarsGMedlem sedan dec. 200012 464 inlägg
#13

Alternativ 2 är effektivare.

------------------
essentitia preter non sans multiplicandum

RocketMedlem sedan feb. 2000372 inlägg
#14

Ok då vinner du :)

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)