login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Gebruik van JOINS

Offline Frederic - 08/05/2005 12:21
Avatar van FredericPHP ver gevorderde Ik heb nu dit script, maar aangezien de 2 in verbinding staan met leden_berichten.van en leden.id, dacht ik eraan om joins te gebruiken. Dit is mijn huidig script:
  1. <? $select = "SELECT * FROM leden_berichten WHERE id = ".$id." && naar = ".$_SESSION['gid'];
  2. if (!$sql = mysql_query($select))
  3. {
  4. echo "Fout bij ophalen van berichten!";
  5. }
  6. else
  7. {
  8. mysql_query("UPDATE leden_berichten SET gelezen='ja' WHERE id='".$_GET['id']."'");
  9. while ($rij = mysql_fetch_assoc($sql)){
  10. $van = ($rij['van']);
  11. $onderwerp = ($rij['onderwerp']);
  12. $bericht = ($rij['bericht']);
  13. $datum = ($rij['datum']);
  14.  
  15. $sql_van = mysql_query("SELECT (gebruikersnaam) FROM `leden` WHERE id = ".$van."") or die(mysql_error());
  16. $rij_van = mysql_fetch_assoc($sql_van);
  17. $van_naam = ($rij_van['gebruikersnaam']);
  18.  
  19. activeer_ubb($onderwerp);
  20. activeer_ubb($bericht);
  21. $datum = datum_nl($datum);
  22. }?>

Ik dacht aan zoiets, maar dit is maar een wilde gok:

  1. <? $select = "SELECT leden.gebruikersnaam, leden_berichten.onderwerp, leden_berichten.bericht, leden_berichten.datum FROM leden_berichten WHERE id = ".$id." && naar = ".$_SESSION['gid']." INNER JOIN leden_berichten ON (leden.id = leden_berichten.van)"; ?>

10 antwoorden

Gesponsorde links
Offline Thomas - 08/05/2005 14:23
Avatar van Thomas Moderator Je wilt de berichten van een lid bepalen ? Dan heb je toch aan een WHERE-conditie met het lid-id genoeg ? Als je dan toch JOINs wilt gebruiken (wat dus niet echt nodig is) dien je een LEFT JOIN te gebruiken denk ik (leden-tabel LEFT JOIN berichten-tabel, in die volgorde) - een INNER JOIN levert je altijd de "tightest fit" van twee tabellen, en aangezien je leden tabel maar één item bevat zal je query-resultaat dus ook maar uit één resultaat-rij bestaan (ik kan het fout hebben though) ?
Je hoeft iig niet per se een JOIN te gebruiken.
Offline Frederic - 08/05/2005 14:46
Avatar van Frederic PHP ver gevorderde Maar als ik de WHERE-conditie gebruik, kan ik dan ook het volgend doen:

ik hoef enkel de gebruikersnaam uit de tabel leden die overeenkomt met het veld 'van' in leden_berichten (hier heb ik wel alles uit nodig). Dan heb ik toch 2 query's nodig, niet?
Offline Thomas - 08/05/2005 14:52
Avatar van Thomas Moderator Jup, tenzij MySQL nieuw genoeg is om geneste queries uit te voeren (SELECT * FROM ... WHERE id =(SELECT * FROM ... WHERE ...)).
Offline Frederic - 08/05/2005 15:11
Avatar van Frederic PHP ver gevorderde Oei, nu vrees ik dat ik even niet meer kan volgen!
  1. <?
  2. $select = "SELECT * FROM leden_berichten WHERE id = ".$id." && naar = ".$_SESSION['gid'];
  3. $sql = mysql_query($select)
  4. while ($rij = mysql_fetch_assoc($sql)){
  5. $van = ($rij['van']);
  6. $onderwerp = ($rij['onderwerp']);
  7. $bericht = ($rij['bericht']);
  8. $datum = ($rij['datum']);
  9.  
  10. $sql_van = mysql_query("SELECT (gebruikersnaam) FROM `leden` WHERE id = ".$van."") or die(mysql_error());
  11. $rij_van = mysql_fetch_assoc($sql_van);

Hoe kan ik deze nu samenvoegen?
En vanaf welke versie kan ik geneste queries uitvoeren?
Offline Thomas - 08/05/2005 16:07
Avatar van Thomas Moderator http://dev.mysql.com/doc/mysql/en/subqueries.html
Citaat:
Starting with MySQL 4.1, all subquery forms and operations that the SQL standard requires are supported, as well as a few features that are MySQL-specific.
Zoals jij het doet, zijn het meer dan twee queries he ?
Je zou dit sorteer-probleem ook naar PHP kunnen verplaatsen, door bijvoorbeeld alles in arrays op te slaan (en daar dus te 'sorteren').

Je kan ook twee tabellen aan elkaar hangen door gewoon de juiste kolommen met elkaar te laten 'matchen', dus je zou de twee bovenstaande queries kunnen samenvoegen, bijvoorbeeld op de volgende manier:

  1. SELECT l.gebruikersnaam, lb.*
  2. FROM leden l, leden_berichten lb
  3. WHERE lb.van = l.id
  4. AND lb.id = $id
  5. AND lb.naar = $_SESSION['gid']


SELECT l.gebruikersnaam, lb.*
je wilt alleen de kolom "gebruikersnaam" van de tabel leden hebben, en alle gegevens (*) van leden_berichten

FROM leden l, leden_berichten lb
je gebruikt voor de tabellen leden en leden_berichten respectievelijk de aliassen (verkorte schrijfwijzen) "l" en "lb"

WHERE lb.van = l.id
dit statement geeft aan hoe je de twee tabellen aan elkaar hangt

AND lb.id = $id
dit is een extra conditie waaraan de query-resultaten dienen te voldoen

AND lb.naar = $_SESSION['gid']
dit is ook een extra conditie waaraan de query-resultaten dienen te voldoen
Offline Frederic - 08/05/2005 17:25
Avatar van Frederic PHP ver gevorderde Dan heb bovenstaande query (uit mijn eerste bericht) dus vervangen door deze:
  1. <?php $id = $_GET['id'];
  2. select = "SELECT l.gebruikersnaam, lb.* FROM leden l, leden_berichten lb WHERE lb.van = l.id AND lb.id = ".$id." AND lb.naar = ".$_SESSION['gid'];
  3. if (!$sql = mysql_query($select))
  4. {
  5. echo "Fout bij ophalen van berichten!";
  6. }
  7. else
  8. {
  9. mysql_query("UPDATE leden_berichten SET gelezen='ja' WHERE id='".$_GET['id']."'");
  10. while ($rij = mysql_fetch_assoc($sql)){
  11. $van = ($rij['l.gebruikersnaam']);
  12. $onderwerp = ($rij['lb.onderwerp']);
  13. $bericht = ($rij['lb.bericht']);
  14. $datum = ($rij['lb.datum']);
  15.  
  16. activeer_ubb($onderwerp);
  17. activeer_ubb($bericht);
  18. $datum = datum_nl($datum);
  19. ?>

maar dat geeft
Citaat:
Parse error: parse error, unexpected '='
op de 2e regel... Klopt het voor de rest?
Offline Simeken - 08/05/2005 17:28
Avatar van Simeken HTML beginner
  1. <?php $id = $_GET['id'];
  2. select = "SELECT l.gebruikersnaam, lb.* FROM leden l, leden_berichten lb WHERE lb.van = l.id AND lb.id = ".$id." AND lb.naar = ".$_SESSION['gid'];
  3. if (!$sql = mysql_query($select))
  4. { ...

moet
  1. <?php $id = $_GET['id'];
  2. // met een $-teken voor select!!
  3. $select = "SELECT l.gebruikersnaam, lb.* FROM leden l, leden_berichten lb WHERE lb.van = l.id AND lb.id = ".$id." AND lb.naar = ".$_SESSION['gid'];
  4. if (!$sql = mysql_query($select))
  5. {

worden 
Offline Frederic - 08/05/2005 17:45
Avatar van Frederic PHP ver gevorderde Hmm, nu krijg ik een hele reeks foutmeldingen
Citaat:
Notice: Undefined index: l.gebruikersnaam
Notice: Undefined index: lb.datum
Notice: Undefined index: lb.bericht

en allemaal in deze regels:
  1. $van = ($rij['l.gebruikersnaam']);
  2. $onderwerp = ($rij['lb.onderwerp']);
  3. $bericht = ($rij['lb.bericht']);
  4. $datum = ($rij['lb.datum']);

Klopt dit dan niet? 
Offline Gml - 08/05/2005 17:58
Avatar van Gml HTML beginner als het goed is kan het gewoon zo

  1. $van = ($rij['gebruikersnaam']);


Zonder die punten erin
Offline Frederic - 08/05/2005 21:10 (laatste wijziging 08/05/2005 21:10)
Avatar van Frederic PHP ver gevorderde Ah ja, dat klopt!

Nu heb ik nog een laatste probleem:
Ik heb
  1. <? $sql = mysql_query("SELECT * FROM `leden_berichten` WHERE naar = '".$_SESSION['gid']."' ORDER BY id DESC") or die(mysql_error());
  2. while ($rij = mysql_fetch_assoc($sql)){
  3. $kleur = ($i++ % 2) ? '#F1F3F5' : '#DEE2E7';
  4. $berichtid = ($rij["id"]);
  5. $van = ($rij["van"]);
  6. $gelezen = ($rij["gelezen"]);
  7. $datum = ($rij["datum"]);
  8.  
  9. $sql_van = mysql_query("SELECT (gebruikersnaam) FROM `leden` WHERE id = ".$van."") or die(mysql_error());
  10. $rij_van = mysql_fetch_assoc($sql_van);
  11. $van_naam = ($rij_van['gebruikersnaam']); ?>

vervangen door
  1. <? $sql = mysql_query("SELECT leden.gebruikersnaam, leden.id, leden_berichten.* FROM leden, leden_berichten WHERE leden_berichten.naar = ".$_SESSION['gid']." ORDER BY leden_berichten.id DESC");
  2. while ($rij = mysql_fetch_assoc($sql)){
  3. $kleur = ($i++ % 2) ? '#F1F3F5' : '#DEE2E7';
  4. $berichtid = ($rij["id"]);
  5. $van = ($rij["van"]);
  6. $gelezen = ($rij["gelezen"]);
  7. $datum = ($rij["datum"]);
  8.  
  9. //$sql_van = mysql_query("SELECT (gebruikersnaam) FROM `leden` WHERE id = ".$van."") or die(mysql_error());
  10. //$rij_van = mysql_fetch_assoc($sql_van);
  11. //$van_naam = ($rij_van['gebruikersnaam']);?>

Maar nu echo't hij ieder bericht zoveel keer als dat er leden (in tabel leden) zijn...
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2025 Sitemasters.be - Regels - Laadtijd: 0.278s