/ 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] order by
Fra : Martin


Dato : 05-10-09 16:04

Hej..

Jeg har nogle ID'er som skal sorteres lidt specielt

SELECT * FROM tx_extendedshop_products WHERE pid IN
(1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)

De skal sorteres som der står i den liste
altså
1652, 1653 osv.

Fyrer jeg ingen ORDER BY på, så kommer 1285 først

Fyrer jeg
ORDER BY pid IN
(1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)

Så kommer 1285 også først, så hvordan skal man sorterer disse?

PS
PID er IKKE primær nøgle, og har ikke autoincrement på, hvis det skulle
have nogen betydning :)

 
 
Martin (05-10-2009)
Kommentar
Fra : Martin


Dato : 05-10-09 16:08

Martin wrote:
> Hej..
>
> Jeg har nogle ID'er som skal sorteres lidt specielt
>
> SELECT * FROM tx_extendedshop_products WHERE pid IN
> (1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)
>
> De skal sorteres som der står i den liste
> altså
> 1652, 1653 osv.
>
> Fyrer jeg ingen ORDER BY på, så kommer 1285 først
>
> Fyrer jeg
> ORDER BY pid IN
> (1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)
>
> Så kommer 1285 også først, så hvordan skal man sorterer disse?
>
> PS
> PID er IKKE primær nøgle, og har ikke autoincrement på, hvis det skulle
> have nogen betydning :)

ORDER BY pid =1652, pid =1653, pid=1654, pid=1656, pid=1657, pid=1660,
pid=1285, pid=1661, pid=1664, pid=1665, pid=1667, pid=1669

Virker, men findes der er en nemmere løsning?
Jeg kan selvfølgelig sagtens programmerer mig ud af dette...

Arne Vajhøj (06-10-2009)
Kommentar
Fra : Arne Vajhøj


Dato : 06-10-09 00:12

Martin wrote:
> Jeg har nogle ID'er som skal sorteres lidt specielt
>
> SELECT * FROM tx_extendedshop_products WHERE pid IN
> (1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)
>
> De skal sorteres som der står i den liste
> altså
> 1652, 1653 osv.
>
> Fyrer jeg ingen ORDER BY på, så kommer 1285 først
>
> Fyrer jeg
> ORDER BY pid IN
> (1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)
>
> Så kommer 1285 også først, så hvordan skal man sorterer disse?

Hvad med at lave en lille sorterings tabel, så du kan lave:

SELECT *
FROM tx_extendedshop_products, sort_order
WHERE tx_extendedshop_products.pid=sort_order.pid
AND tx_extendedshop_products.pid IN
(1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)
ORDER BY sort_order.sort_value

?

Arne


Lars Kongshøj (06-10-2009)
Kommentar
Fra : Lars Kongshøj


Dato : 06-10-09 07:29

Martin skrev:
> Hej..
>
> Jeg har nogle ID'er som skal sorteres lidt specielt
>
> SELECT * FROM tx_extendedshop_products WHERE pid IN
> (1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)
>
> De skal sorteres som der står i den liste
> altså
> 1652, 1653 osv.
>
> Fyrer jeg ingen ORDER BY på, så kommer 1285 først
>
> Fyrer jeg
> ORDER BY pid IN
> (1652,1653,1654,1656,1657,1660,1285,1661,1664,1665,1667,1669)
>
> Så kommer 1285 også først, så hvordan skal man sorterer disse?
>
> PS
> PID er IKKE primær nøgle, og har ikke autoincrement på, hvis det skulle
> have nogen betydning :)

Du har designet din database forkert, eller vælger i bedste fald at
skrive din query på en forkert måde.

Jeg går ud fra at du ikke ønsker at sortere på id-erne, men på _din_
viden om, hvad der ligger af information knyttet til den enkelte id.
Den viden bør også ligge et sted i databasen, og du bør så vælge det/de
felter, der indeholder informationen til at sortere efter.

Desuden er det i lodret modstrid med god programmeringsskik at hardcode
id'er og lignede ind i sine programmer. Vil du skrive dine programmer om
hver gang, der forsvinder to id'er og kommer fem nye til? Eller når
detaljeinformationen for tre af id'erne ændrer sig, så sorteringen skal
ændres?

--
Lars Kongshøj
http://www.kongshoj.com/

Stig Johansen (06-10-2009)
Kommentar
Fra : Stig Johansen


Dato : 06-10-09 09:44

Lars Kongshøj wrote:

> Du har designet din database forkert, eller vælger i bedste fald at
> skrive din query på en forkert måde.

Enig.

> Jeg går ud fra at du ikke ønsker at sortere på id-erne, men på _din_
> viden om, hvad der ligger af information knyttet til den enkelte id.
> Den viden bør også ligge et sted i databasen, og du bør så vælge det/de
> felter, der indeholder informationen til at sortere efter.

Også enig.
Hvis han ønsker en given sorteringsrække, så kan man altrnativt bruge:
SELECT <min.ting>,<noget> FROM <noget> WHERE <noget> = <noget>
UNION ALL
SELECT <min.ting + 1>,<noget> FROM <noget> WHERE <noget> = <noget>
osv.

> Desuden er det i lodret modstrid med god programmeringsskik at hardcode
> id'er og lignede ind i sine programmer.

Ja, men sådan må det vel være....

--
Med venlig hilsen
Stig Johansen

Martin (06-10-2009)
Kommentar
Fra : Martin


Dato : 06-10-09 11:26

Stig Johansen wrote:
> Lars Kongshøj wrote:
>
>> Du har designet din database forkert, eller vælger i bedste fald at
>> skrive din query på en forkert måde.
>
> Enig.
>
>> Jeg går ud fra at du ikke ønsker at sortere på id-erne, men på _din_
>> viden om, hvad der ligger af information knyttet til den enkelte id.
>> Den viden bør også ligge et sted i databasen, og du bør så vælge det/de
>> felter, der indeholder informationen til at sortere efter.

Bare rolig, id's kommer fra et sted hvor man vælger hvilke produkter der
skal vises på netop denne side. - Så nej jeg skal ikke skrive queryen om
på noget tidspunkt.

Men jeg er HELT enig om at hvis jeg skulle designe databasen, så ville
jeg også gøre det helt anderledes.

Der er allerede 2 forskellige måder at sorterer produkter på, der er
produktnummer og et sorteringsfelt.

Problemet er at kunden gerne ville kunne sorterer produkterne
forskelligt fra side til side, og alle produkter bliver oprettet 1 sted
- men bliver valgt et 3. sted, og lige netop det 3. sted findes der
ingen måder at sorterer på, andet end at finde ud af hvilke produkter
der kommer først i listen over ID'er

Man skal nok kende lidt til det CMS der bliver brugt Typo3, for at helt
kunne forstå det. :)

>
> Også enig.
> Hvis han ønsker en given sorteringsrække, så kan man altrnativt bruge:
> SELECT <min.ting>,<noget> FROM <noget> WHERE <noget> = <noget>
> UNION ALL
> SELECT <min.ting + 1>,<noget> FROM <noget> WHERE <noget> = <noget>
> osv.
>
>> Desuden er det i lodret modstrid med god programmeringsskik at hardcode
>> id'er og lignede ind i sine programmer.
>
> Ja, men sådan må det vel være....
>

Gert Krabsen (06-10-2009)
Kommentar
Fra : Gert Krabsen


Dato : 06-10-09 11:40

Martin skrev:
> Stig Johansen wrote:
>> Lars Kongshøj wrote:
>>
>>> Du har designet din database forkert, eller vælger i bedste fald at
>>> skrive din query på en forkert måde.
>> Enig.
>>
>>> Jeg går ud fra at du ikke ønsker at sortere på id-erne, men på _din_
>>> viden om, hvad der ligger af information knyttet til den enkelte id.
>>> Den viden bør også ligge et sted i databasen, og du bør så vælge det/de
>>> felter, der indeholder informationen til at sortere efter.
>
> Bare rolig, id's kommer fra et sted hvor man vælger hvilke produkter der
> skal vises på netop denne side. - Så nej jeg skal ikke skrive queryen om
> på noget tidspunkt.
>
> Men jeg er HELT enig om at hvis jeg skulle designe databasen, så ville
> jeg også gøre det helt anderledes.
>
> Der er allerede 2 forskellige måder at sorterer produkter på, der er
> produktnummer og et sorteringsfelt.
>
> Problemet er at kunden gerne ville kunne sorterer produkterne
> forskelligt fra side til side,

Så må du oprette flere sorteringsfelter, så der er et til hvert behov..

Eller fortælle kunden, at han ikke kan sortere efter et
ikke-eksisterende kriterie..

Alt andet ender med at blive noget klamphuggeri ;-(


Martin (06-10-2009)
Kommentar
Fra : Martin


Dato : 06-10-09 11:38

Gert Krabsen wrote:
> Martin skrev:
>> Stig Johansen wrote:
>>> Lars Kongshøj wrote:
>>>
>>>> Du har designet din database forkert, eller vælger i bedste fald at
>>>> skrive din query på en forkert måde.
>>> Enig.
>>>
>>>> Jeg går ud fra at du ikke ønsker at sortere på id-erne, men på _din_
>>>> viden om, hvad der ligger af information knyttet til den enkelte id.
>>>> Den viden bør også ligge et sted i databasen, og du bør så vælge det/de
>>>> felter, der indeholder informationen til at sortere efter.
>>
>> Bare rolig, id's kommer fra et sted hvor man vælger hvilke produkter der
>> skal vises på netop denne side. - Så nej jeg skal ikke skrive queryen om
>> på noget tidspunkt.
>>
>> Men jeg er HELT enig om at hvis jeg skulle designe databasen, så ville
>> jeg også gøre det helt anderledes.
>>
>> Der er allerede 2 forskellige måder at sorterer produkter på, der er
>> produktnummer og et sorteringsfelt.
>>
>> Problemet er at kunden gerne ville kunne sorterer produkterne
>> forskelligt fra side til side,
>
> Så må du oprette flere sorteringsfelter, så der er et til hvert behov..

Enig, jeg ville også oprette en ny tabel ala
produkt_id, side_id og sortering

Problemet er så bare at det hele er en kæmpe extension så lige at få
indarbejdet dette, ville nok tage en helt del længere tid, end de 6
ekstra linjers kode jeg nu har skrevet for at få det til at virke perfekt.

> Eller fortælle kunden, at han ikke kan sortere efter et
> ikke-eksisterende kriterie..
>
> Alt andet ender med at blive noget klamphuggeri ;-(

Nu er kunden rigtig glad, og kan se det virker helt perfekt, så at sige
nu "at det kan man ikke" ville nok være lidt dumt hehe...

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

Månedens bedste
Årets bedste
Sidste års bedste