/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL: Advanceret ORDER BY
Fra : Kasper Johansen


Dato : 27-09-04 20:55

Hej gruppe.

Jeg laver et udtræk fra databasen. I feltet "rank" er der en masse tal som
jeg vil have databasen til at sortere efter, dog hvis rank er 0 skal den
tidst. Ellers skal den gå fra 1 og opefter.

Er det muligt at gøre dette?

Mvh
Kasper Johansen



 
 
///JJ (26-09-2004)
Kommentar
Fra : ///JJ


Dato : 26-09-04 21:04

Kasper Johansen wrote:
> Hej gruppe.
>
> Jeg laver et udtræk fra databasen. I feltet "rank" er der en masse
> tal som jeg vil have databasen til at sortere efter, dog hvis rank er
> 0 skal den tidst. Ellers skal den gå fra 1 og opefter.
>
> Er det muligt at gøre dette?

Undskyld hvis dette ikke kan bruges - det er fra MS SQL:

select * from tabel where rank<>0 order by rank asc
union
select * from tabel where rank=0

Kan ikke lige huske om det skal være "union all" - men det er også blot til
inspiration til din MySQL-query!
--
Mvh
///JJ



Troels Arvin (27-09-2004)
Kommentar
Fra : Troels Arvin


Dato : 27-09-04 21:27

On Sun, 26 Sep 2004 22:04:02 +0200, ///JJ wrote:

> Undskyld hvis dette ikke kan bruges - det er fra MS SQL:
>
> select * from tabel where rank<>0 order by rank asc union select * from
> tabel where rank=0

Garanterer MSSQL virkelig, at en UNION returnerer rækker fra første
udtryk før det andet?

--
Greetings from Troels Arvin, Copenhagen, Denmark


Kristian Damm Jensen (28-09-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 28-09-04 09:19

Troels Arvin <troels@arvin.dk> wrote in message news:<pan.2004.09.27.20.27.09.189331@arvin.dk>...
> On Sun, 26 Sep 2004 22:04:02 +0200, ///JJ wrote:
>
> > Undskyld hvis dette ikke kan bruges - det er fra MS SQL:
> >
> > select * from tabel where rank<>0 order by rank asc union select * from
> > tabel where rank=0
>
> Garanterer MSSQL virkelig, at en UNION returnerer rækker fra første
> udtryk før det andet?

Og hvis den gør, hvad gør den så, hvis der er dubletter?

Og tillader den virkelig, at man laver sortering på del-elementerne i en union?

VH
Kristian

///JJ (27-09-2004)
Kommentar
Fra : ///JJ


Dato : 27-09-04 21:47

Kristian Damm Jensen wrote:
> Troels Arvin <troels@arvin.dk> wrote in message
> news:<pan.2004.09.27.20.27.09.189331@arvin.dk>...
>> On Sun, 26 Sep 2004 22:04:02 +0200, ///JJ wrote:
>>
>>> Undskyld hvis dette ikke kan bruges - det er fra MS SQL:
>>>
>>> select * from tabel where rank<>0 order by rank asc union select *
>>> from tabel where rank=0
>>
>> Garanterer MSSQL virkelig, at en UNION returnerer rækker fra første
>> udtryk før det andet?

Har ikke prøvet.

> Og hvis den gør, hvad gør den så, hvis der er dubletter?

Det er vist her "union all" kommer ind...

> Og tillader den virkelig, at man laver sortering på del-elementerne i
> en union?

Mig bekendt kan du union'e alt bare feltnavnene/typerne passer.

--
Mvh
///JJ



Kristian Damm Jensen (29-09-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 29-09-04 07:07

"///JJ" <nospam@tdcadsl.dk> wrote in message news:<4159cdb8$0$181$edfadb0f@dtext02.news.tele.dk>...
> Kristian Damm Jensen wrote:
> > Troels Arvin <troels@arvin.dk> wrote in message
> > news:<pan.2004.09.27.20.27.09.189331@arvin.dk>...
> >> On Sun, 26 Sep 2004 22:04:02 +0200, ///JJ wrote:
> >>
> >>> Undskyld hvis dette ikke kan bruges - det er fra MS SQL:
> >>>
> >>> select * from tabel where rank<>0 order by rank asc union select *
> >>> from tabel where rank=0
> >>
> >> Garanterer MSSQL virkelig, at en UNION returnerer rækker fra første
> >> udtryk før det andet?
>
> Har ikke prøvet.

Men det er dog temmelig essentiel i forhold til den løsning du
foreslog.

> > Og hvis den gør, hvad gør den så, hvis der er dubletter?
>
> Det er vist her "union all" kommer ind...

Der var ikke spørgsmålet. Spørgsmålet er: hvis det er tilladt at lave
en sortering på delelementer af en union, og det er garanteret, at
sorteringsrækkefølgen vil blive bevaret efter sammensmeltningen med de
andre delelementer er udført, hvad gør MSSQL så, hvis der findes
poster, der findes i flere delelementer? Hvilke poster bliver så
fjernet?

> > Og tillader den virkelig, at man laver sortering på del-elementerne i
> > en union?
>
> Mig bekendt kan du union'e alt bare feltnavnene/typerne passer.

Ikke efter standarden.

Man kan ikke lave sortering på andet end slutresultatet. (Hvilket i
mine øjne giver god mening. Delelementerne af en union er at
sammenligne med en subselect - dem ville man vel heller ikke give sig
til at sortere på?)

VH
Kristian

Peter Lykkegaard (29-09-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 29-09-04 07:22

"Kristian Damm Jensen" wrote

> Man kan ikke lave sortering på andet end slutresultatet. (Hvilket i
> mine øjne giver god mening. Delelementerne af en union er at
> sammenligne med en subselect - dem ville man vel heller ikke give sig
> til at sortere på?)

Jow da - i forb med TOP vil det give mening at sortere i en subselect

- Peter



Kristian Damm Jensen (29-09-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 29-09-04 11:14

"Peter Lykkegaard" <polonline@hotmail.com> wrote in message news:<2rv2jsF1et7ijU1@uni-berlin.de>...
> "Kristian Damm Jensen" wrote
>
> > Man kan ikke lave sortering på andet end slutresultatet. (Hvilket i
> > mine øjne giver god mening. Delelementerne af en union er at
> > sammenligne med en subselect - dem ville man vel heller ikke give sig
> > til at sortere på?)
>
> Jow da - i forb med TOP vil det give mening at sortere i en subselect

Indrømmet.

Men så er vi også ude over standarden og inde i proprietær-formaterne.

VH
Kristian

///JJ (29-09-2004)
Kommentar
Fra : ///JJ


Dato : 29-09-04 13:31

Kristian Damm Jensen wrote:
> "///JJ" <nospam@tdcadsl.dk> wrote in message
> news:<4159cdb8$0$181$edfadb0f@dtext02.news.tele.dk>...
>> Kristian Damm Jensen wrote:
>>> Troels Arvin <troels@arvin.dk> wrote in message
>>> news:<pan.2004.09.27.20.27.09.189331@arvin.dk>...
>>>> On Sun, 26 Sep 2004 22:04:02 +0200, ///JJ wrote:
>>>>
>>>>> Undskyld hvis dette ikke kan bruges - det er fra MS SQL:
>>>>>
>>>>> select * from tabel where rank<>0 order by rank asc union select *
>>>>> from tabel where rank=0
>>>>
>>>> Garanterer MSSQL virkelig, at en UNION returnerer rækker fra første
>>>> udtryk før det andet?
>>
>> Har ikke prøvet.
>
> Men det er dog temmelig essentiel i forhold til den løsning du
> foreslog.

Jeg har heller aldrig lovet en færdig løsning - blot inspiration!

>>> Og hvis den gør, hvad gør den så, hvis der er dubletter?
>>
>> Det er vist her "union all" kommer ind...
>
> Der var ikke spørgsmålet.

Så forstod jeg ikke dit spørgsmål.
Da dine følgende bemærkninger intet har at gøre med spørgsmålet lader jeg
det ligge...

--
Mvh
///JJ



Troels Arvin (27-09-2004)
Kommentar
Fra : Troels Arvin


Dato : 27-09-04 21:34

On Mon, 27 Sep 2004 21:54:42 +0200, Kasper Johansen wrote:

> Jeg laver et udtræk fra databasen. I feltet "rank" er der en masse tal
> som jeg vil have databasen til at sortere efter, dog hvis rank er 0 skal
> den tidst. Ellers skal den gå fra 1 og opefter.

Kender du højeste mulige værdi for "rank"?

Hvis vi siger, at "rank" i din tabel aldrig kan tænkes at have værdier
over 99, så kunne man forestille sig en forespørgsel noget i denne stil:

SELECT
fullname,
email,
CASE WHEN rank=0 THEN 100
ELSE rank
AS modified_rank
FROM tablename
ORDER BY modified_rank;

Hvis du ikke kender maksimale værdi, må du først lede efter den i
tabellen (eller benytte et subquery, hvis din MySQL understøtter det), da
MySQL ikke understøtter CHECK-constraints.

PS:
Jeg ved ikke, hvornår CASE-udtryk gled ind i MySQL, men CASE findes i
hvertfald i MySQL 4.0.20.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Peter Brodersen (27-09-2004)
Kommentar
Fra : Peter Brodersen


Dato : 27-09-04 23:07

On Mon, 27 Sep 2004 22:34:23 +0200, Troels Arvin <troels@arvin.dk>
wrote:

>Hvis du ikke kender maksimale værdi, må du først lede efter den i
>tabellen (eller benytte et subquery, hvis din MySQL understøtter det), da
>MySQL ikke understøtter CHECK-constraints.

Hvis man virkelig risikerer at ramme hovedet mod loftet (fx hvis der
optræder tilfælde med den maksimale værdi for den felt-type), så kan
man jo altid lave en ORDER BY på en boolsk værdi til lejligheden.

SELECT
fullname,
email,
FROM tablename
ORDER BY (rank = 0), rank;

Felter, hvor (rank = 0) er sand, vil komme til sidst.

>PS:
>Jeg ved ikke, hvornår CASE-udtryk gled ind i MySQL, men CASE findes i
>hvertfald i MySQL 4.0.20.

Den er temmeligt gammel. Alternativt kan den omskrives til en IF(),
der også er temmeligt gammel.
--
- Peter Brodersen

Ugens sprogtip: af sted (og ikke afsted)

Peter Brodersen (28-09-2004)
Kommentar
Fra : Peter Brodersen


Dato : 28-09-04 13:03

On Tue, 28 Sep 2004 00:07:24 +0200, Peter Brodersen <usenet@ter.dk>
wrote:

>SELECT
> fullname,
> email,
>FROM tablename
>ORDER BY (rank = 0), rank;

Rettelse:

SELECT
fullname,
email
FROM tablename
ORDER BY (rank = 0), rank;

--
- Peter Brodersen

Ugens sprogtip: professionel (og ikke proffessionel)

Troels Arvin (29-09-2004)
Kommentar
Fra : Troels Arvin


Dato : 29-09-04 09:01

On Tue, 28 Sep 2004 14:02:54 +0200, Peter Brodersen wrote:

> SELECT
> fullname,
> email
> FROM tablename
> ORDER BY (rank = 0), rank;

Fedt - en kort og simpel løsning.

Ifølge [1] - der foreslår en lidt mere klodset udgave af ovenstående
query - risikerer man dog, at MSSQL ikke vil benytte index på nævnte
query-type; det er MSSQL sikkert ikke alene om.

Nævnte kilde foreslår benyttelse af særlige en særlig view-type eller
midlertidige tabeller, hvis man løber ind i performanceproblemer.


Noter
-----
1: Itzik Ben-Gan, Tom Moreau:
Advanced Transact-SQL for SQL Server 2000
ISBN 1893115828
http://www.apress.com/book/bookDisplay.html?bID=72

Kapitel 17 findes online som prøve-afsnit; relevante
tekst findes i kapitil 17s underafsnit
"Getting NULLs to Sort Last Instead of First".

--
Greetings from Troels Arvin, Copenhagen, Denmark


Jeppe Uhd (28-09-2004)
Kommentar
Fra : Jeppe Uhd


Dato : 28-09-04 08:30

Kasper Johansen wrote:
> Hej gruppe.
>
> Jeg laver et udtræk fra databasen. I feltet "rank" er der en masse
> tal som jeg vil have databasen til at sortere efter, dog hvis rank er
> 0 skal den tidst. Ellers skal den gå fra 1 og opefter.
>
> Er det muligt at gøre dette?

select * from table order by rank>0 desc,rank asc;

--
MVH Jeppe Uhd - NX http://nx.dk
Webhosting for nørder og andet godtfolk



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste