25. april 2010 - 20:32Der 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());
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.
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:
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.
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.
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')
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());
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.
$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());
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());
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
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());
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.