05. maj 2004 - 14:07Der er
10 kommentarer og 1 løsning
sortering af mysql udtryk - problem
For at får et output der giver følgende: Skole A: Klasse a1 medlemmer Klasse a2 medlemmer
Skole B: Klasse b1 medlemmer Klasse b2 medlemmer
Har jeg lavet nedenstående kode, hvor $findmed er det sql udtryk der finder medlemmerne:
$kategori="dummyværdi"; $kategori2="dummyværdi2"; while ($row=mysql_fetch_array($findmed)) { if ($kategori!=$row['skole']) { $kategori=$row['skole']; print "<p><font size=-2><b>$row[skole]</b><br>"; } if ($kategori2!=$row['klasse']) { $kategori2=$row['klasse']; print "<p><font size=-1><b>$row[klasse]</b><br>"; } echo "<font size=-2>$row[medlem_fornavn] $row[medlem_efternavn]<br>";
Det virker næsten efter hensigten, men hvis der på en skole kun er medlemmer fra en klasse, så bliver denne linje ikke lavet: print "<p><font size=-1><b>$row[klasse]</b><br>";
$findmed = mysql_query("select medlemmer.*, udd_inst.udd_inst_navn, med_org.med_org_navn from medlemmer, udd_inst, med_org where medlemmer.medlem_status ='aktiv' and medlemmer.medlem_underskrift <> '' and medlemmer.medlem_indalder='under' and medlemmer.medlem_indmeldt and medlemmer.medlem_indmeldt>='$rowaar[aar_start]' and medlemmer.medlem_indmeldt<='$rowaar[aar_slut]' and medlemmer.medlem_udd_inst=udd_inst.id and med_org.id=medlemmer.medlem_med_org order by medlemmer.medlem_udd_inst, medlemmer.medlem_med_org") or die(mysql_error());
$kategori="dummyværdi"; $kategori2="dummyværdi2"; while ($row=mysql_fetch_array($findmed)) { if ($kategori!=$row['udd_inst_navn']) { $kategori=$row['udd_inst_navn']; print "<p><font size=-2><b>$row[udd_inst_navn]</b><br>"; } if ($kategori2!=$row['med_org_navn']) { $kategori2=$row['med_org_navn']; print "<p><font size=-1><b>$row[med_org_navn]</b><br>"; } echo "<font size=-2>$row[medlem_fornavn] $row[medlem_efternavn]<br>";
Jeg gad ikke lave en database magen til din, derfor lavede jeg nogle ekelte "rækker" med data i, som jeg looper igennem. Med disse data kan jeg konstatere, at dine if-sætninger virker efter hensigten, og at det derfor må være din udvælgelse eller din sortering det går galt med. Prøv at gæøre forespørgslen mere enkel, til testformål.
$findmed = mysql_query(" SELECT medlemmer.*, udd_inst.udd_inst_navn, med_org.med_org_navn FROM ( medlemmer JOIN udd_inst ON medlemmer.medlem_udd_inst = udd_inst.id ) JOIN med_org ON medlemmer.medlem_med_org = med_org.id WHERE medlemmer.medlem_status = 'aktiv' AND medlemmer.medlem_underskrift <> '' AND medlemmer.medlem_indalder = 'under' AND medlemmer.medlem_indmeldt # overflødig linie §3 AND medlemmer.medlem_indmeldt >= '$rowaar[aar_start]' # fare §2 AND medlemmer.medlem_indmeldt <= '$rowaar[aar_slut]' ORDER BY medlemmer.medlem_udd_inst, # vist fejl §1 medlemmer.medlem_med_org ") or die(mysql_error());
Jeg har stillet din SQL kommando op så den er lidt mere læselig.
Og det der falder i øjnene er:
§1: i din ORDER BY sorterer du efter .id felterne i udd_inst og med_org, ikke efter udd_inst_navn og med_org_navn. Det betyder at dine rækker sandsynligvis sorteres efter den rækkefølge de blev oprettet i.
§2: et farepunkt er feltet medlem_indmeldt hvor din WHERE clause kan fejle hvis ikke du har sørget for at skrive data i yyyymmdd format.
§3: hvis feltet er NULL vil der ikke komme true på nogen af betingelserne nedenunder
Vedr: §1, jeg har valgt denne sortering for at få et output der finder alle medlemmer der høre til en en given udd.institution dernæst skal der opdeles så medlemmer til denne udd.institution fordeles på de forskellige medlems organisationer der er. Det virker som sagt fint, så længe der er mere end en medlems organisationer repæsenteret på en udd.institution. Det ganske sikkert her fejlen ligger - jeg ved bare ikke hvad jeg skal gøre ved det?!
vedr: §2, så er datoen skrevet i unixtimestamp format og det ser ikke ud til at der er nogle problemer her
vedr §3, så er linje en fejl, den er nu slettet, ud at det gør en forskel
Problemet var ikke i min order by. Nedenstående gave det rigtige resultat: $kategori="dummyværdi"; while ($row=mysql_fetch_array($findmed)) { if ($kategori!=$row['udd_inst_navn']) { $kategori=$row['udd_inst_navn']; print "<p><font size=-1><b>$row[udd_inst_navn]</b><br>"; $kategori2="dummyværdi"; }
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.