Avatar billede qualon1 Nybegynder
12. september 2005 - 21:29 Der er 13 kommentarer og
2 løsninger

En lidt svær sortering med mysql

Hej...

Jeg har et webshop system kørende, hvor hver vare kan tildeles 3 forskellige kategorier. Men jeg vil også gerne tilføje en sorterings funktion, så man kan administrer i hvilken rækkefølge varene står.
Dette ville jo være nem nok at lave hvis det bare var en kategori, så kunne man jo bare lave et sorterings felt. Men det er her mit problem er.
Jeg har jo 3 kategorier, og derfor skal jeg jo også have 3 felter med sortering.
Min tabel ser sådan her ud:
navn - kategori1 - kategori2 - kategori3 - sort1 - sort2 - sort3

Det jeg ønsker at få fremstilt er en kode som kan klare denne sortering. Det er nemlig ikke altid at de forskellige vare står i den samme kategori nummer (kategori1, kategori2 og kategori3), så derfor skal sortering tage højde for hvilken kategori den vare er i...

Så det jeg gerne vil have formuleret i en mysql forespørgsel er:

SORT BY (hvis $_GET[vid] er lig kategori1 så sortere den efter sort1 ASC) OR (hvis $_GET[vid] er lig kategori2 så sortere den efter sort2 ASC) OR (hvis $_GET[vid] er lig kategori3 så sortere den efter sort3 ASC)

håber nogen vil hjælpe...
Avatar billede coderdk Praktikant
12. september 2005 - 21:38 #1
Prøv at lave et stort statement med nogle UNIONs, a la denne:

$sql = "
  (SELECT
    *
  FROM
    tabel
  WHERE
    kategori1 = '$_GET[vid]'
  ORDER BY
    sort1)
  UNION
  (SELECT
    *
  FROM
    tabel
  WHERE
    kategori2 = '$_GET[vid]'
  ORDER BY
    sort2)
  (SELECT
    *
  FROM
    tabel
  WHERE
    kategori3 = '$_GET[vid]'
  ORDER BY
    sort3)
  ";
Avatar billede nielle Nybegynder
12. september 2005 - 21:40 #2
F.eks. sådan her?

$SQL = "SELECT * FROM denTabel ORDER BY ";

if ($_GET["vid"] == "kategori1")
    $SQL .= "sort1";
else if ($_GET["vid"] == "kategori2")
    $SQL .= "sort2";
else if ($_GET["vid"] == "kategori3")
    $SQL .= "sort3";

$SQL .= " ASC";
Avatar billede coderdk Praktikant
12. september 2005 - 21:40 #3
Hmm nu jeg tænker mig om, bliver den garanteret optimeret væk :\

Har lige kigget i dokumentationen, den bliver optimeret væk med mindre man bruger LIMIT i hver SELECT... Ikke optimalt ;P
Avatar billede nielle Nybegynder
12. september 2005 - 21:45 #4
... eller dette?

SELECT * FROM
(
(SELECT *, sort1 AS sort WHERE kategori1 = $_GET[vid])
UNION
(SELECT *, sort2 AS sort WHERE kategori2 = $_GET[vid])
UNION
(SELECT *, sort3 AS sort WHERE kategori3 = $_GET[vid])
)
ORDER BY sort ASC
Avatar billede qualon1 Nybegynder
12. september 2005 - 21:45 #5
en limit? mener du at hvis jeg tilføjer en limit til hver så kan det virke? fordi det næste jeg skal lave er en sideskift funktion så ville ikke gøre noget hvis det skal med...
Avatar billede qualon1 Nybegynder
12. september 2005 - 21:47 #6
nielle.. du kan ikke lave den der... Da nogen af de varer som ligger i tabellen er i er gemt i kategori1, andre i kategori2 og andre i kategori3... så det skal være alle den viser men laver en samlet sortering..
Avatar billede nielle Nybegynder
12. september 2005 - 21:51 #7
Hvad mener du egentlig med at den f.eks. ligger i kategori1? Kategori1 er jo et felt i din tabel, og der kan der jo stå en værdi (som formentlig er et id i din tabel af kategorier). Men der kan jo også stå en værdi i kategori2 og ...3.
Avatar billede qualon1 Nybegynder
12. september 2005 - 21:57 #8
ja... hvis nu vi antager at den kategoriID vi arbejder med lige nu er 25, så kan 25 stå i enten kategori1, kategori2 eller kategori3. Det står nødvændigvis ikke i samme kategorifeltnummer, derfor denne sortering er lidt svært...
Avatar billede nielle Nybegynder
12. september 2005 - 22:02 #9
Umiddelbart ville jeg mene at 12/09-2005 21:45:34 netop gør dette. Men, kan du ikke give os nogle simple eksempler sådan at det bliver mere klart hvad du vil have ud?
Avatar billede qualon1 Nybegynder
12. september 2005 - 22:41 #10
jo et eksempel:

Der står i tabellen:
navn  kat1  kat2  kat3  sort1  sort2  sort3
test1  25    0      0      5      0      0
test2  0      25    20    0      2      1
test3  0      0      25    0      0      4
test4  25    20    19    1      2      1
test5  19    25    20    2      3      3

Og da det er kategoriID 25 vi arbejder med, skulle den gerne udskrive:


test4 - 1
test2 - 2
test5 - 3
test3 - 4
test1 - 5
Avatar billede qualon1 Nybegynder
13. september 2005 - 16:05 #11
yes... fandt en løsning...

(SELECT *, sort1 AS sort WHERE kategori1 = $_GET[vid])
UNION
(SELECT *, sort2 AS sort WHERE kategori2 = $_GET[vid])
UNION
(SELECT *, sort3 AS sort WHERE kategori3 = $_GET[vid])
)
ORDER BY sort ASC

Denne query gjorde det jeg gerne ville, så det er bare perfekt.. Jeg synes nielle og coderdk skal ligge et svar så i kan få point..
Avatar billede coderdk Praktikant
13. september 2005 - 16:26 #12
Hovedparten bør gå til nielle :)
Avatar billede qualon1 Nybegynder
13. september 2005 - 16:30 #13
ja regner med 75%-25% men skal nødt til at vente til han svarer også...
Avatar billede nielle Nybegynder
13. september 2005 - 18:28 #14
Svar :^)
Avatar billede nielle Nybegynder
13. september 2005 - 20:27 #15
Takker for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester