|
| [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...
| |
|
|