Avatar billede MSR Juniormester
19. april 2010 - 02:00 Der er 9 kommentarer og
1 løsning

fejl i sql

Hejsa
jeg har et problem med følgende kode:

$result = mysql_query("SELECT k.*, DATE_FORMAT(k.dato, '%d/%m/%Y') as dag, TIME_FORMAT(k.dato, '%H-%m-%S') as klokken, COUNT(t.id) as antal FROM kalender k
                LEFT JOIN tilmeldinger t ON k.id = t.kursus_id WHERE k.tilmeldingsfrist > NOW() GROUP BY t.kursus_id");
                while ($row = mysql_fetch_array($result))
                {
                IF ($row['antal'] >= $row['hold_antal']) {$link = "kurset er fyldt";}
                ELSEIF ($row['status'] == "Aflyst") {$link = "";} ELSE {$link = "<a href='vis_kursus.php?id=" . $row['id'] . "'>læs mere</a>";};
                echo "<tr>
                <td>" . $row['dag'] . "</td>
                <td>" . $row['klokken'] . "</td>
                <td>" . $row['type'] . "</td>
                <td>" . $row['status'] . "</td>
                <td>$link</td>
                <td>" . $row['antal'] . "/" . $row['hold_antal'] . "</td>
                </tr>";
                };
                ?>

problemet er at lige gyldigt hvad vises der kun 1 kursus selvom den burde vise alle der er åbne = tilmeldingsfrist EFTER NU > now(). nogen der kan se hvad jeg kan klokket i?
på forhånd tak
Avatar billede arne_v Ekspert
19. april 2010 - 02:22 #1
Er k.tilmeldingsfrist en DATETIME ?
Avatar billede MSR Juniormester
19. april 2010 - 11:16 #2
hej Arne
ja det er det. problemet er lige der omkring for da jeg vendte > til < viser den fint mine gamle kurser.
det virker bare som om den kun viser kurser der har tilmeldte.
kan du se hvad det er?

Magnus
19. april 2010 - 18:57 #3
Forstaar jeg korrekt at dit centrale problem er at faa listet alle aabne kurser sammen med antal tilmeldinger til hvert kursus, inklusive nul-antal for de kurser der endnu ingen tilmeldinger har?  I saa fald skal du GROUP BY k.id, ikke by t.kursusid.  Proev i din mysql_query at aendre GROUP BY t.kursusid til GROUP BY k.id og se om du saa ikke kommer videre.
Avatar billede MSR Juniormester
20. april 2010 - 00:58 #4
Desværre. det gjorde ingen forskel men rigtigt forstået.
jeg ønsker at vise alle fremtidige kurser og deres tilmeldings-antal/ledige pladser.
Det jeg tror er problemer er at flere af kurserne endnu ikke har noget tilmeldte og derfor ikke noget at "group by".
så returnerer den 0 og vises derfor ikke.
dog hvis kurset INDEN altså med en lavere kursus_id HAR tilmeldte, tages det tomme kursus med.
Det virker sgu underligt.... hva?

Det er sikkert bare en slåfejl som det oftest er men jeg har efterhånden haft en del hoveder på denne og ingen har kunnet lure den endnu
20. april 2010 - 07:21 #5
Det forstaar jeg ikke.  Meningen med LEFT JOIN er jo netop at den skal vise alle raekker i kalender uanset om der er tilsvarende raekker i tilmeldinger.

Du kunne jo proeve at teste selve queryen ved midlertidig at forenkle koden saaledes:

$result = mysql_query("SELECT k.id, COUNT(t.id) FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id GROUP BY k.id") or die(mysql_error());
while ($row = mysql_fetch_array($result)) echo $row['id'] . " " . $row['antal'] . "<br/>";

Den skulle meget gerne give en liste af kursus id'er og antal tilmeldinger til hver, inklusiv 0 for kurser uden tilmelding.  Hvis ikke saa maa der vaere noget underligt med tabellerne.  Hvis du faar listen med kurser og tilmeldinger, inklusiv nul-tilmeldinger, saa maa problemet ligge et andet sted i queryen - kan der for eksempel alligevel vaere noget med datatypen af tilmeldingsfrist.
Avatar billede MSR Juniormester
20. april 2010 - 11:34 #6
$result = mysql_query("SELECT k.id, COUNT(t.id) as antal FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id GROUP BY k.id") or die(mysql_error());
while ($row = mysql_fetch_array($result)) echo $row['id'] . " " . $row['antal'] . "<br/>";
sådan ser ja. der manglede lige noget! :P

Den viser korrekt ja. hvad faaan er det så?
jeg prøver lige at kigge i tabellen igen så
Avatar billede MSR Juniormester
20. april 2010 - 11:50 #7
for pokker da. du klarede den sgu!
problemet var så min group by der, som du gjorde, skulle pege på k.id og ikke t.id som min gjorde.
nu virker det vist helt fint. mange tak for hjælpen.
jeg er ked af at jeg var for nærig til at give mere end 30 points men jeg ved ikke hvordan jeg forhøjer det?
smid mig et svar så får du points (hvis du er interesseret)

og igen, tak
Magnus
20. april 2010 - 12:04 #8
Jeg taenkte nok at det kunne ikke fejle.  Saa gaa naeste skridt og proev om det er WHERE klausulen der er problemet:

$result = mysql_query("SELECT k.id, COUNT(t.id) as antal FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id WHERE k.tilmeldingsfrist > NOW() GROUP BY k.id") or die(mysql_error());
while ($row = mysql_fetch_array($result)) echo $row['id'] . " " . $row['antal'] . "<br/>";

Hvis der er aabne kurser hvor der ingen tilmeldinger er saa skulle de komme frem som kurser med 0 antal.  Hvis ikke, saa ligger problemet i WHERE klausulen og du maa kikke igen paa datatype og vaerdier af tilmeldingsfrist.

Hvis det gaar godt saa indsaetter du "DATE_FORMAT.....dag og ....klokken.  Gaar det ogsaa godt saa maa problemet ligge i din php kode.  Det kunne for eksempel vaere at navnet paa en af kolonnerne i tabellen ikke svarer til $row['type'] eller $row['status'] eller hvad.

Skridt for skridt kan du snaevre det ind til du finder hvor det gaar galt.  Fortael mig hvordan det gaar.
Avatar billede MSR Juniormester
20. april 2010 - 13:26 #9
$result = mysql_query("SELECT k.*, DATE_FORMAT(k.dato, '%d/%m/%Y') as dag, TIME_FORMAT(k.dato, '%H-%m-%S') as klokken, COUNT(t.id) as antal FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id WHERE k.tilmeldingsfrist > NOW() GROUP BY k.id $sortby");

Det virker.
jeg ændrede faktisk bare k.id i min gamle kode og alt andet fulgte med. jeg kan ikke se flere problemer så tak for det.
vil du have points?

Magnus
20. april 2010 - 14:04 #10
Det var godt vi fik det til at virke.  Her er mit 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
Computerworld tilbyder specialiserede kurser i database-management

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