login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Probleem met een query INNER Join

Offline roelh - 06/05/2009 20:12
Avatar van roelhPHP gevorderde Goeie avond allemaal 

Ik ben bezig met iets voor een les.
Heb nu dit om de leerlingen uit te lezen en de films uit te lezen waarvoor ze zich op gegeven hebben.

  1. $select = mysql_query("SELECT * FROM leerlingen ORDER BY voornaam DESC") or die (mysql_error());
  2. while($arr = mysql_fetch_assoc($select))
  3. {
  4. $films = mysql_query("SELECT * FROM films INNER JOIN leerlingen ON (leerlingen.id = films.leerlingenid)");
  5. while($arrfilms = mysql_fetch_assoc($films))
  6. {


Nu heb ik 2 leerlingen erin staan.
1 leerling heeft 2 films warvoor hij zich heeft op gegeven en 1 leerling 1 film.
Maar bij BEIDE leerlingen geeft hij beide films weer.
Wat doe ik hier nu verkeerd aan?
Wie o wie kan me helpen aub?

Groet,

Dit zijn de tabellen.

  1. CREATE TABLE IF NOT EXISTS `films` (
  2. `id` int(1) NOT NULL AUTO_INCREMENT,
  3. `filmnaam` varchar(30) NOT NULL,
  4. `url` varchar(30) DEFAULT NULL,
  5. `leerlingenid` varchar(50) DEFAULT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
  8.  
  9. --
  10. -- Gegevens worden uitgevoerd voor tabel `films`
  11. --
  12.  
  13. INSERT INTO `films` (`id`, `filmnaam`, `url`, `leerlingenid`) VALUES
  14. (1, 'Wijster', 'http://www.moviemeter.nl/film/', '1'),
  15. (2, 'American History X', NULL, '1');
  16.  
  17. -- --------------------------------------------------------
  18.  
  19. --
  20. -- Tabel structuur voor tabel `leerlingen`
  21. --
  22.  
  23. CREATE TABLE IF NOT EXISTS `leerlingen` (
  24. `id` int(1) NOT NULL AUTO_INCREMENT,
  25. `voornaam` varchar(30) NOT NULL,
  26. `tussenvoegsel` varchar(30) DEFAULT NULL,
  27. `achternaam` varchar(34) NOT NULL,
  28. PRIMARY KEY (`id`)
  29. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
  30.  
  31. --
  32. -- Gegevens worden uitgevoerd voor tabel `leerlingen`
  33. --
  34.  
  35. INSERT INTO `leerlingen` (`id`, `voornaam`, `tussenvoegsel`, `achternaam`) VALUES
  36. (1, 'Roel', '', ''),
  37. (2, 'Jorrik', '', '');

6 antwoorden

Gesponsorde links
Offline Joost - 06/05/2009 20:20 (laatste wijziging 06/05/2009 20:22)
Avatar van Joost PHP expert Het is nu een beetje vreemd wat je doet. Je selecteert eerst alle leerlingen, en daarna ga je een JOIN leggen met de tabel waarvan je net alles hebt geselecteerd. Dat is juist de kracht van JOIN  
Je was op de goede weg met de 2e query, maar die eerste kan volledig weggelaten worden.

Voor je huidige probleem:
Je moet nog een WHERE clausule invoegen bij de $films query, namelijk waar het leerlingen ID gelijk is aan de huidige in je loop.

Wat je beter kan doen:
Je kan deze 2 queries ook in 1 query schrijven, dat is een stuk MySQL vriendelijker.
  1. SELECT `leerlingen`.*, `films`.* FROM `films` INNER JOIN `leerlingen` ON `leerlingen`.`id`=`films`.`leerlingenid` ORDER BY `leerlingen`.`voornaam`
Offline roelh - 06/05/2009 20:24
Avatar van roelh PHP gevorderde Ik heb namelijk nog meer tabellen, zoals boeken, musea e.d.
Kan dat allemaal in 1 join of...?
Offline Joost - 06/05/2009 20:29 (laatste wijziging 06/05/2009 20:30)
Avatar van Joost PHP expert
roelh schreef:
Ik heb namelijk nog meer tabellen, zoals boeken, musea e.d.
Kan dat allemaal in 1 join of...?
Oke, dus leerlingen kunnen naar een film, musea, etc, etc?

Dat lijkt mij niet handig, omdat je daarbij dan ook alle data selecteert voor de film als iemand naar een museum gaat, enzovoorts. Je kan dan het beste een query voor elk soort uitje maken.
Ik weet dit niet zeker, ik ben geen MySQL pro, maar met een beetje testen kwam ik er niet uit.
Offline roelh - 06/05/2009 20:34
Avatar van roelh PHP gevorderde Hmm,

Zal proberen uit te leggen.
Iedereen kan naar een film kijken, boek lezen, musea toe blabla.
Nu kijken bijvoorbeeld 5 leerlingen dezelfde film, 2 leerlingen dezelfde boek en 3 leerlingen gaan naar verschillende musea toe.
Nu wil ik dus dat bij elke leerlingen word uitgelezen welke film ze gekeken hebben en welke boek ze gelezen hebben en welke musea ze bezocht hebben.

Nu wil ik dit op 1 pagina weergeven.
Nu had ik dus in de tabel bij elke film leerlingid gemaakt, als iemand daaraan toegevoegd word, bij die leerling de film word uitgelezen.
Offline Joost - 06/05/2009 21:00
Avatar van Joost PHP expert Wat het eerste bij me opkomt is een nieuwe tabel maken, met bijvoorbeeld:

leerling_id | activiteit_type | activiteit_id

En daar dan vanuit verder werken.
Offline roelh - 06/05/2009 21:11
Avatar van roelh PHP gevorderde Denk wel dat zo moet ja...
Ik vind het moeilijk om uit te leggen.
Misschien dat ik het kan doen door gewoon een HTML te maken.
Hierin zie je dat ik dus enkele films heb gekeken, boeken gelezen en een musea heb bezocht.
En dan wil ik dus me hele klas onder elkaar en wie ook die activiteiten hebben gedaan, OF andere dat je dat kunt zien.
'Hopelijk zo beter te snappen?


Plaatscode: 136388
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.21s