08. december 2011 - 13:24Der er
8 kommentarer og 1 løsning
Sql left join ?
Hey. jeg har lavet en så man kan tilmelde sig til nogle motions hold men når der er flere der tilmelder sig det samme hold så bliver den <div> der indeholder der hvor man trykker tilmeld (og hvor der står hvad det er osv.) bliver kopiret så det står der 2 gange (og vis der er 3 der tilmelder sig kommer frem 3 gange osv.) er ret sikker på at problemet ligger i en sql sætning med left join men er ik så skarp til joins.
//sql sætningen $sql = mysql_query("SELECT h.id, h.aktivitet, h.holdnr, h.instruktor, h.dato, h.tidspunkt, h.antal, h.tilmeldt, ht.holdid, ht.userid FROM hold AS h LEFT JOIN hold_tilmelding AS ht ON h.id=ht.holdid ORDER BY dato ASC");
Din sql sætning søger efter all de der er tilmeldt, og derefter laver du en div for hver tilmeldte.
Var det meningen at en bruger kan tilmelde sig og derefter se sin egen tilmelding, ikke alle tilmeldingerne? I så fald, hvordan ved dit system hvilken user der er i færd med at tilmelde sig? Er useren logget ind, og kan man indfange useres id i en variabel $userid eller lignende? I så fald indfører du den begrænsning i din sql sætning:
$sql = mysql_query("SELECT h.id, h.aktivitet, h.holdnr, h.instruktor, h.dato, h.tidspunkt, h.antal, h.tilmeldt, ht.holdid, ht.userid FROM hold AS h LEFT JOIN hold_tilmelding AS ht ON h.id=ht.holdid WHERE ht.userid = £userid ORDER BY dato ASC");
Brugeren logger ind inden ja. og efter brugeren har tilmeldt sig kan han stadig se alle de andre hold den eneste foreskel på siden er faktisk at det hold han lige har tilmeldt sig er blevet rødt og der står frameld istedet for. Mht hvordan systemet kan se brugeren er ifærd med at tilmelde sig så er der: //Den der bliver udført når man trykker "tilmeld" if (isset($_GET['tilmeld_hold'])) { if (isset($_GET['id'])) { $id = $_GET['id'];
$sql = mysql_query("SELECT tilmeldt FROM hold WHERE id='$id'"); $row = mysql_fetch_assoc($sql); $tilmeldt = $row['tilmeldt'] + 1;
$sql_ret = "UPDATE hold SET tilmeldt='$tilmeldt' WHERE id='$id'"; $result1 = mysql_query($sql_ret) or die(mysql_error()); header('location:?tilmeldhold=ok'); } }
//den er bliver udført når man trykker frameld if (isset($_GET['frameld_hold'])) { if (isset($_GET['id'])) { $id = $_GET['id']; $userid = $_SESSION['id']; //$sql_slet = mysql_query("DELETE tilmeldt FROM hold WHERE holdnr='$id'"); $sql_del = mysql_query("DELETE FROM hold_tilmelding WHERE holdid='$id' AND userid='$userid'");
$sql = mysql_query("SELECT tilmeldt FROM hold WHERE id='$id'"); $row = mysql_fetch_assoc($sql); $tilmeldt = $row['tilmeldt'] - 1;
$sql_ret = "UPDATE hold SET tilmeldt='$tilmeldt' WHERE id='$id'"; $result1 = mysql_query($sql_ret) or die(mysql_error()); header('location:?frameld_hold=ok'); } }
Du fortæller i #3, at brugeren kan identificeres med $id. Men tilbage til det oprindelige spørgsmål. Du stiller denne forespørgsel:
$sql = mysql_query("SELECT h.id, h.aktivitet, h.holdnr, h.instruktor, h.dato, h.tidspunkt, h.antal, h.tilmeldt, ht.holdid, ht.userid FROM hold AS h LEFT JOIN hold_tilmelding AS ht ON h.id=ht.holdid ORDER BY dato ASC");
Resultatet bliver en liste over alle tilmeldinger for alle hold. Hvis der er 10 hold og tre tilmeldinger til hver får du 30 rækker i dit resultat. I din while løkke udskriver du en <div class="boxlt"> for hver af disse rækker. Det siger du så er for meget. Hvad vil du så se i stedet for? Det fortæller du ikke.
Hvis du vil se en liste over alle hold som en bestemt user er tilmeldt, og hvis id'en på denne user er i $id, så begrænser du resultatet ved i forespørgselen at indføje WHERE ht.userid = '$id' Hvis det er alle tilmeldte for et bestemt hold du vil have, så må du identificere det ønskede hold i en variabel $hold og i forespørgslen sige WHERE h.id = '$hold Og hvis du kun vil have en bestemt user tilmeldt et bestemt hold bruger du både $id og $hold i WHERE klausulen.
Svarer det på spørgsmålet? Eller har jeg ikke forstået problemet? I så fld, hvor går jeg forkert?
Hm jeg ser lige om jeg kan forklare det bedre. lige nu skriver den en liste med alle holdene (hvilket den skal blive ved med). når der så er 1 der tilmelder sig et af holdene skifter der hvor der står "tilmeld" til "Frameld" (det skal den også blive ved med) men når der så er 2 der tilmelder sig det samme hold så skriver den 2 <div class="boxIt"> ud istedet for kun 1 (det vil sige der kommer til at stå 2 af det samme hold med samme id på listen hvor der på det ene står tilmeld og det andet frameld og der skal kun være 1 af hver med det samme id) så det er mere hvorfor skriver den det hold ud igen ? og hvordan fixer man det :S som sagt er ik så skarp til joins bruger det meeget sjælendt. var det bedre beskrevet ? :S
Aha, du vil søge efter alle hold. For hvert hold skal der ske følgende:
Hvis holdet er gammelt (i.e. $tid < $timestamp) skal holdet slettes fra databasen. Ellers: Hvis holdet er fuld skal der stå Optaget. Ellers skal der stå en liste over alle der er tilmeldt. For hver tilmeldte skal der enten være en knap for at framelde (for den bruger der er logged på) eller en knap for at tilmelde. For eksempel således, hvis det er user3 der er logget på (med vilje forenklet)
Det kender jeg to måder at gøre på. Den første og simpleste er at lave to queries i stedet for en join query. Den anden er, ud fra join queryen, for hver række at undersøge, om holdet er det samme som i den foregående række og i så fald ikke udskrive holdet. Nedenfor skitserer jeg den første måde:
//først søger du kun holdene $sql = mysql_query(SELECT * FROM hold); while($row = mysql_fetch_assoc($sql)) { $dato = ... $tid = ... $id = ... ... if($tid<$timestamp ....) { $sql_delete = mysql_query("DELETE FROM ...."); } else { echo '<div class="boxlt">'; echo '<p class = "points"...'; .... if($row['tilmeldt'] == $row['antal']) { ..koden der skriver optaget.. } else //her søger du så tilmeldingerne til det pågældende hold { $sql1 = mysql_query(SELECT * FROM hold_tilmelding WHERE holdid = $id); while($row1 = mysql_fetch_assoc($sql1)) if($row1['userid']==$_SESSION['id']) { ..her kommer koden der giver en frameld knap.. } else { ..her kommer koden der giver en tilmeld knap. } } echo </div> } }
Hvis du har for travlt for tiden til dette her, så foreslår jeg, at du lukker spørgsmålet og så, når tiderne er bedre, reflekterer over det og åbner et nyt spørgsmål, hvis du så stadig sidder fast. (Jeg har også travlt, men jeg tog mig tiden til at først at udforske hvad problemstillingen nu var og derefter foreslå en løsning. Jeg vil gerne undgå nu at blive hængende i et åbent spørgsmål, forstår du det?)
Hvis du på den anden side vil videre med sagen, så fortæl, om jeg nu, i indlæg #5, har forstået problemstillingen. Har du prøvet mine forslag af? I så fald, vis mig den kode du kører nu, forklar hvad output den giver, og forklar hvad det skulle have været i stedet.
Så lukker jeg spørgsmålet indtil der er bedre tid. Men mange tak for din tid :)
Synes godt om
Ny brugerNybegynder
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.