Avatar billede walkie84 Nybegynder
25. april 2010 - 20:32 Der er 18 kommentarer og
1 løsning

MySQL ORDER BY FIELD problem

Kære eksperter,

Jeg har brug for lidt hjælp til nedenstående, hvor jeg forsøger at sortere et sql udtræk efter 3 forskellige felter, ved brug af "order by field". Det bliver desværre bare ikke sorteret på den måde.
Har i nogle ideer til hvorfor? :)


$result2 = mysql_query("SELECT * FROM instruktoer where id = '$row1[inst_id]' ORDER BY FIELD(TITEL, 'Instruktør', 'Hjælpeinstruktør', 'Minihjælper');") or die (mysql_error());

while($row2 = mysql_fetch_array($result2)) {
echo "<A href=?id=$row2[id]>$row2[navn]</A> - $row2[titel]<BR>";
}



Mvh Morten
Avatar billede repox Seniormester
25. april 2010 - 20:43 #1
Hvordan bliver det så sorteret?
Avatar billede walkie84 Nybegynder
25. april 2010 - 21:12 #2
I samme rækkefølge som hvis jeg ikke havde skrevet "ORDER BY FIELD(..."
Avatar billede repox Seniormester
25. april 2010 - 21:19 #3
...

Af gode grunde kan det jo antages at det ikke er korrekt - du må læse udtrækket forkert; enten grundet for kort gennemgang af dit resultat eller af manglende forståelse for funktionaliteten i din sortering.
Avatar billede walkie84 Nybegynder
25. april 2010 - 21:24 #4
Pt. bliver udtrækket $row2[titel] printet således:

Minihjælper
Hjælpeinstruktør
Instruktør

Det er det samme, som hvis jeg sletter "ORDER BY..."

Det er første gang jeg bruger ORDER BY FIELD, så det er meget muligt at jeg har misforstået det, men så vidt jeg har læst mig til, så burde den lave udtrækket således:

Instruktør
Hjælpeinstruktør
Minihjælper
Avatar billede repox Seniormester
25. april 2010 - 21:28 #5
Problemet kan ligge i din anvendelse af æ ø og å - prøv at lave en test tabel med data uden de tegn og se om det giver det ventede resultat. Er det tilfældet kan du have en uoverenstemmelse i din character encoding.
Avatar billede walkie84 Nybegynder
25. april 2010 - 21:34 #6
Jeg har forsøgt at ændre æ til ae og ø til oe, men udtrækket er stadig det samme :(

Har du andre ide'er til hvad det kan være repox? Og tak for din hjælp indtil videre :) Du må sige til hvis du kender en anden må at gøre det på.
Avatar billede erikjacobsen Ekspert
25. april 2010 - 21:48 #7
For mig at se laver du udtræk inden i hinanden. Din ORDER BY FIELD dækekr kun der inderste. Derfor vil den samlede sortering selvfølgelig ikke være i overensstemmelse med din ORDER BY FIELD.
25. april 2010 - 22:07 #8
Det er laenge siden jeg selv har brugt ORDER BY FIELD, saa jeg testede det ved at lave en tabel walkie84 med de nedenstaaende vaerdier.  I feltet titel brugte jeg ogsaa en vaerdi der er forskellig fra 'Instruktoer', 'hjaelpeinstruktoer', 'Minihjaelper' og den kom, som forventet, foerst.  Det burde virke som du forventer.  Hvis ikke saa kunne det maaske ligge i din tabel?  Normalt forventer man (eller jeg er vant til) at hvis en tabel har et felt 'id' saa er det felt primaernoegle saa der for et bestemt id kun findes en raekke.  Aabenbart resulterer din $result1 i en id, og naar du soeger paa den id, hvis id er primaernoegle, kommer der kun en raekke og der er ikke noget at sortere.  (Maaske er det hvad erikjacobsen mener med at lave udtraek inden i hinanden.)  Kan det ogsaa have at goere med 'casesensitivity?'  Hedder dit felt 'TITEL' eller maaske 'titel'?  Proev at beskriv tabellen instruktoer og giv os koden i $result1.

Her er min test-tabel med vaerdier, min forespoergsel, og resultatet:

CREATE TABLE walkie84(id INT, titel VARCHAR(20), navn VARCHAR(10));

INSERT INTO walkie84 VALUES(1, 'Supervisor', 'navn2');
INSERT INTO walkie84 VALUES(1, 'Supervisor', 'navn4');
INSERT INTO walkie84 VALUES(1, 'Instruktoer', 'navn6');
INSERT INTO walkie84 VALUES(1, 'Instruktoer', 'navn8');
INSERT INTO walkie84 VALUES(1, 'Hjaelpeinstruktoer', 'navn10');
INSERT INTO walkie84 VALUES(1, 'Hjaelpeinstruktoer', 'navn12');
INSERT INTO walkie84 VALUES(1, 'Minihjaelper', 'navn14');
INSERT INTO walkie84 VALUES(1, 'Minihjaelper', 'navn16');
INSERT INTO walkie84 VALUES(2, 'Minihjaelper', 'navn18');
INSERT INTO walkie84 VALUES(1, 'Supervisor', 'navn1');
INSERT INTO walkie84 VALUES(1, 'Instruktoer', 'navn5');
INSERT INTO walkie84 VALUES(1, 'Hjaelpeinstruktoer', 'navn9');
INSERT INTO walkie84 VALUES(1, 'Hjaelpeinstruktoer', 'navn11');
INSERT INTO walkie84 VALUES(1, 'Minihjaelper', 'navn13');
INSERT INTO walkie84 VALUES(1, 'Minihjaelper', 'navn15');
INSERT INTO walkie84 VALUES(2, 'Minihjaelper', 'navn17');
INSERT INTO walkie84 VALUES(2, 'Minihjaelper', 'navn19');
INSERT INTO walkie84 VALUES(1, 'Supervisor', 'navn3');
INSERT INTO walkie84 VALUES(1, 'Instruktoer', 'navn7');

SELECT * FROM walkie84 WHERE id = 1 ORDER BY FIELD(TITEL, 'Instruktoer', 'hjaelpeinstruktoer', 'Minihjaelper')

id  titel  navn 
      1 Supervisor navn2
      1 Supervisor navn3
      1 Supervisor navn1
      1 Supervisor navn4
      1 Instruktoer navn8
      1 Instruktoer navn5
      1 Instruktoer navn6
      1 Instruktoer navn7
      1 Hjaelpeinstruktoer navn12
      1 Hjaelpeinstruktoer navn9
      1 Hjaelpeinstruktoer navn11
      1 Hjaelpeinstruktoer navn10
      1 Minihjaelper navn16
      1 Minihjaelper navn14
      1 Minihjaelper navn13
      1 Minihjaelper navn15
Avatar billede walkie84 Nybegynder
25. april 2010 - 22:15 #9
Det har du ret i Erik! Det er sq nok der den ligger. Har du et forslag til hvordan jeg kan løse den?
Herunder er begge udtræk:


$result1 = mysql_query("SELECT * FROM hold_inst where hold_navn = '$hold'") or die (mysql_error());
while($row1 = mysql_fetch_array($result1)){

  $result2 = mysql_query("SELECT * FROM instruktoer where id = '$row1[inst_id]' ORDER BY FIELD(TITEL, 'Instruktoer',  'Hjaelpeinstruktoer', 'Minihjaelper');") or die (mysql_error());

  while($row2 = mysql_fetch_array($result2)) {
    echo "<A href=?id=$row2[id]>$row2[navn]</A> - $row2[titel]<BR>";
  }
}
Avatar billede walkie84 Nybegynder
25. april 2010 - 22:24 #10
Tak for dit input Christian, men grunden til at det ikke virker, er selvfølgelig at jeg har mit udtræk inden i en anden løkke..

Jeg mangler bare en måde at få det sorteret på..
Avatar billede walkie84 Nybegynder
25. april 2010 - 22:26 #11
Jeg har forsøgt at lave det hele i en inner join, men kan sq ikke rigtig få det til at virke.
Avatar billede erikjacobsen Ekspert
25. april 2010 - 22:30 #12
Jamen det skal nok laves med en join. Hvordan ser dit forsøg ud?
25. april 2010 - 22:40 #13
Ja, du soeger i $result2 kun efter en raekke ad gangen i tabel 'instruktoer'.  Derfor er der ikke noget for ORDER BY FIELD at sortere.  I $result1 soeger du (aabenbart) efter hvilke instruktoer id-er der hoerer til et bestemt instruktoer hold.  Jeg kunne forestille mig at du skilte de to forespoergsler ad.  Foerst koerer du $result1 og gemmer id-erne i en array, derefter koerer du $result2 hvor du soeger efter "WHERE id IN [arraen] og sorterer de resulterende raekker med ORDER BY FIELD...

Det er ved at vaere sengetid i Belgien (hvor nogen af os bor.)  Med mindre der i mellemtiden foreligger en loesning skal jeg i morgen tidlig proeve at skrive og teste en kode ifoelge ovenstaaende.
Avatar billede walkie84 Nybegynder
25. april 2010 - 22:43 #14
Det så cirka sådan ud :)


$result1 = mysql_query("
SELECT in.id,in.navn,in.titel,hi.hold_navn,hi.inst_id
FROM instruktoer in INNER JOIN hold_inst hi
ON (in.id = hi.inst_id)
WHERE hi.hold_navn = '$hold'
") or die (mysql_error());

while($row1 = mysql_fetch_array($result1)) {
echo "<A href=?id=$row1[in.id]>$row1[in.navn]</A> - $row1[in.titel]<BR>";
}
Avatar billede erikjacobsen Ekspert
25. april 2010 - 22:53 #15
Du skal bruge almindelige navne på felter, og de skal helst "stroffes" - sådan ca.

$result1 = mysql_query("
SELECT in.id as inid,in.navn as innavn,in.titel as intitel,hi.hold_navn,hi.inst_id
FROM instruktoer in INNER JOIN hold_inst hi
ON (in.id = hi.inst_id)
WHERE hi.hold_navn = '$hold'
") or die (mysql_error());

while($row1 = mysql_fetch_array($result1)) {
echo "<A href=?id={$row1['inid']}>{$row1['innavn']}</A> - {$row1['intitel']}<BR>";
}

og så ved jeg ikke lige hvad du skal bruge resten af felterne til?
Avatar billede walkie84 Nybegynder
25. april 2010 - 23:01 #16
Aaah ja, det giver god mening Erik :)

Jeg får dog denne fejl, når jeg kører det:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'in INNER JOIN hold_inst hi ON (in.id = hi.inst_id) WHERE hi.hold_navn =' at line 2
Avatar billede erikjacobsen Ekspert
25. april 2010 - 23:03 #17
Ja, "in" er et reserveret ord. Det en nok nemmest at vælge et andet.
Avatar billede walkie84 Nybegynder
25. april 2010 - 23:15 #18
Ja selvfølgelig..! Godt spottet Erik :)
Og gæt hvad.. Nu virker det helt perfekt - også med ORDER BY FIELD!

Jeg kan se at du ikke samler på point, så hvis der er nogle der vil have dem - christian eller repox, så skriv et svar.

Tusind tak for hjælpen Erik!! - og tak for forsøget i andre :)

Her er løsningen til nysgerrige sjæle:

SELECT inst.id as inid,inst.navn as innavn,inst.titel as intitel,hi.hold_navn,hi.inst_id
FROM instruktoer inst INNER JOIN hold_inst hi
ON (inst.id = hi.inst_id)
WHERE hi.hold_navn = '$hold'
ORDER BY FIELD(titel, 'Instruktør', 'Hjælpeinstruktør', 'Minihjælper');
") or die (mysql_error());


while($row1 = mysql_fetch_array($result1)) {
echo "<A href=?id={$row1['inid']}>{$row1['innavn']}</A> - {$row1['intitel']}<BR>";
}
26. april 2010 - 05:45 #19
Et svar.
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