Ga naar inhoud

Join tussen drie tabellen lukt niet


anoniem

Aanbevolen berichten

Beste mensen, ik heb de volgende drie tabellen: ================ Tabel 1 sponsor: ================ sponsor_id; sponsor_naam; sponsor_adres; sponsor_postcode; enz. ====================== Tabel 2 sponsor_type: ====================== sponsor_type_id; sponsor_type_naam; met inhoud "shirt", "bal", "reclamebord", "clubblad" ================================= Tabel 3 sponsor_per_sponsor_type: ================================= sponsor_type_id; sponsor_id; Nu worden in tabel 3 de sponsoren gekoppeld aan hetgeen wat zij sponseren. Dit kunnen meer dan 1 type wezen. Dus een sponsor kan shirtsponsor zijn maar ook een advertentie in het clubblad hebben. Nu wil ik via een SELECT met JOIN steeds alle sponsoren filteren die bijvoorbeeld shirt sponsor zijn. Dus ik wil een lijst genereren met alleen die sponsoren die shirt sponsor zijn, maar dit lukt me niet. Hier onder staat het script wat ik tot nu toe heb, maar ik krijg de volgende foutmelding: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /www/htdocs/vvscharn/sponsoren/shirt_sponsoren.php on line 9 dit is het script [code:1:e0c52532b6] <?php $db = mysql_connect("localhost", "******", "*****") or die ("Verbinding mislukt"); mysql_select_db("vvscharn", $db); $SQL_statement = "SELECT * FROM sponsor_type, sponsor_per_sponsor_type, sponsor WHERE sponsor_type.sponsor_type_naam=shirt AND sponsor_type.sponsor_type_id = sponsor_per_sponsor_type.sponsor_type_id AND sponsor_per_sponsor_type.sponsor_type_id=sponsor.sponsor_id"; $resultset= mysql_query($SQL_statement); while($shirt = mysql_fetch_array($resultset)) { //dit is lijn 9 echo $shirt['sponsor_naam'] . " " . $shirt['sponsor_adres'] . "<br>" . $shirt['sponsor_postcode'] . " " . $shirt['sponsor_plaats'] . "<p>"; } mysql_close(); ?> [/code:1:e0c52532b6] Kan iemand mij verder helpen alvast heel erg bedankt
Link naar reactie
  • Reacties 42
  • Aangemaakt
  • Laatste reactie

Beste reacties in dit topic

[code:1:5cc1032379]$query = "select sponsor_adres.tabel_1, sponsor_naam.tabel_1, enz, sponsor_type_naam.tabel_2 from tabel_1 inner join tabel_2 (on sponsor_id.tabel_1 = sponsor_id.tabel_2)";[/code:1:5cc1032379] Hiermee krijg je een output van sponsor_adres, sponsor_naam, enz Alleen het nut van de derde tabel ontgaat mij dan [edit] Misschien beter en wat je bedoelde :) [code:1:5cc1032379]$query = "select sponsor_adres.tabel_1, sponsor_naam.tabel_1, enz, sponsor_type_naam.tabel_2 from tabel_1 inner join tabel_3 (on sponsor_id.tabel_1 = sponsor_id.tabel_3) where sponsor_type_id.tabel_3 = sponsor_type_id.tabel_2";[/code:1:5cc1032379][/edit]
Link naar reactie
Beste sjouken, die derde tabel is er om juist de van elke sponsor aan te geven wat hij sponsort. Zoals jij de select query hebt opgezet is niet helemaal correct want sponsor_id bestaat niet in tabel2. Ik wil dus graag aan de hand van tabel3 het gesponsorde koppelen aan de sponsor. En de gegevens van sponsor wil ik weergeven. Alleen ik krijg steeds een mysql_fetch_array error, wat ik ook probeer. Alvast weer bedankt
Link naar reactie
Je tabel 3 is onvolledig. Daar hoort nog een unieke sleutel bij. Tabel 1 heeft immers een 1:N relatie met Tabel 3. Nu heb geen verstand van PhP maar: Mag je shirt zomaar in de sql plaatsen? Moeten daar geen quotes omheen? Daarnaast lijkt me shirt ongepast, en kun je je beperken tot twee tabellen. Dan lijkt me ook de volgorde niet helemaal juist. Maar voor een lesje sql: http://members.tripod.com/er4ebus/sql/index.htm
Link naar reactie
CREATE TABLE sponsor ( sponsor_id INT NOT NULL PRIMARY KEY auto_increment, sponsor_naam VARCHAR(100) NOT NULL, sponsor_adres VARCHAR(100) NOT NULL, sponsor_plaats VARCHAR(100) NOT NULL, sponsor_tel VARCHAR(11) NOT NULL, sponsor_website VARCHAR(100) NOT NULL, sponsor_mail VARCHAR(100) NOT NULL ); CREATE TABLE sponsor_type ( sponsor_type_id INT NOT NULL PRIMARY KEY auto_increment, sponsortype_naam VARCHAR(100) NOT NULL ); CREATE TABLE sponsor_per_sponsor_type ( sponsor_id INT NOT NULL, sponsor_type_id INT NOT NULL, UNIQUE sponsor_index (sponsor_id, sponsor_type_id) ); Hierboven heb ik de tabelstructuur nog maar even neergezet, daar ik nog steeds niet de juiste oplossing heb gevonden. Iemand misschien toch nog een idee waar het nu misgaat. Alvast bedankt
Link naar reactie
[quote:03ae59886a="Wiep Corbier"]Je tabel 3 is onvolledig. Daar hoort nog een unieke sleutel bij. [/quote:03ae59886a]De relatie tussen sponsor en sponsortype is N-M. De derde tabel is dus gewoon een koppeltabel om deze relatie om te zetten naar twee 1-N relaties. De beide primary keys uit de sponsor en sponsortype table vormen hier dus samen de primary key voor de koppeltabel. De query wordt: [code:1:03ae59886a] SELECT sponsor.*, sponsor_type.sponsortype_naam FROM sponsor, sponsor_per_sponsor_type, sponsor_type WHERE sponsor.sponsor_id = sponsor_per_sponsor_type.sponsor_id AND sponsor_type.sponsor_type_id = sponsor_per_sponsor_type.sponsor_type_id AND sponsor_type.sponsortype_naam = 'shirt' [/code:1:03ae59886a]
Link naar reactie
Iedereen erg bedankt voor jullie reactie, ik ben tot de volgende oplossing gekomen en het werkt (eindelijk): [code:1:3ecc23e0cc] <?php $db = mysql_connect("localhost", "*******", "******") or die ("Verbinding mislukt"); mysql_select_db("vvscharn", $db); $SQL_statement= "SELECT s.sponsor_naam, s.sponsor_adres, s.sponsor_postcode, s.sponsor_plaats FROM sponsor s, sponsor_type t, sponsor_per_sponsor_type st WHERE t.sponsortype_naam = 'shirt' AND s.sponsor_id = st.sponsor_id AND st.sponsor_type_id = t.sponsor_type_id ORDER BY s.sponsor_naam ASC"; $resultset= mysql_query($SQL_statement)or die(mysql_error()); while($shirt = mysql_fetch_array($resultset)) { echo $shirt['sponsor_naam'] . " " . $shirt['sponsor_adres'] . "<br>" . $shirt['sponsor_postcode'] . " " . $shirt['sponsor_plaats'] . "<p>"; } mysql_close(); ?> [/code:1:3ecc23e0cc] Nogmaals bedankt iedereen en wellicht tot de volgende vraag.
Link naar reactie
Ik had dus gedaan: ================ Tabel 1 sponsor: ================ sponsor_id; sponsor_naam; sponsor_adres; sponsor_postcode; enz. ====================== Tabel 2 sponsor_type: ====================== type_id; sponsor_id (link tabel 1) type_naam; met inhoud "shirt", "bal", "reclamebord", "clubblad" Dan krijg je bijvoorbeeld voor sponsoren in tabel 2 1, [color=red:0920ad100e]1[/color:0920ad100e], Shirt 2, [color=red:0920ad100e]1[/color:0920ad100e], Bal 3. [color=red:0920ad100e]1[/color:0920ad100e], Clubblad 4, 2, Bal 5, [color=blue:0920ad100e]3[/color:0920ad100e], Shirt 6, [color=blue:0920ad100e]3[/color:0920ad100e], Bal 7, [color=blue:0920ad100e]3[/color:0920ad100e], Reclamebord.
Link naar reactie
Vind je? Uiteraard zou ik het nét iets anders doen, maar wat jij redundantie noemt is in dit voorbeeld geen redundantie. De waarden 'Bal' etc zouden uit een Runtime Array kunnen komen Een tabel die uitsluitend bestaat uit gegevens die al in andere tabellen bestaat, dat noem ik redundant. Ook moet je rekening houden met duidelijkheid en leesbaarheid. Gezamelijk 'onderhoudbaarheid' dus . Kortom, ik zie echt geen voordelen in de constructie zoals behandeld.
Link naar reactie
Ik wil geen welles/nietes-discussie starten, maar ik wil toch nog graag even op je reageren...[quote:476ac74650="Wiep Corbier"]Een tabel die uitsluitend bestaat uit gegevens die al in andere tabellen bestaat, dat noem ik redundant.[/quote:476ac74650]Dat is ook een vorm van redundantie. Maar stel je nou eens voor dat er een hele lijn t-shirts is, en verschillende maten en kleuren ballen. Op dat moment moet je er toch echt een aparte tabel van maken. Tenminste, dat lijkt mij. Nu begin ik nog te twijfelen ook... Wat is wijsheid, ik weet het niet. Ik zou hoogstwaarschijnlijk de N-M constructie nemen... - Bas
Link naar reactie
Dan maken we er ook geen welles-nietes discussie van BasHamar. Maar neem van mij aan mijn oplossing de meest gangbare is. En ook ik zou in dit geval 3 tabellen hebben, maar dan zo: Tabel 1 ----------------- Sponsor_id (uniek) sponsor_naam Sponsor_adres enz Tabel 2 ----------------- TypeID (uniek) Sponsor_id (link met Tabel 1) Sponsor_Type Tabel 3 (opzoektabel) ----------------- Sponsor_Type (uniek) Sponsor-type bevat: Shirt Bal Reclamebord etc
Link naar reactie
Zo ingewikkeld is die toch ook weer niet? Maar het is dus duidelijk een kwestie van persoonlijke voorkeur. En misschien ontbeer ik wel ervaring in dit vakgebied, maar daar kom ik tzt dan wel achter. Voorlopig sta ik achter mijn standpunten zoals hierboven aangegeven, als iemand goede argumenten aanvoert dat er iets fout is, wat en waarom dan zal ik zeker nog eens kijken naar mijn standpunten. - Bas [b:7a7abc71dd]Edit:[/b:7a7abc71dd] Hé Wiep, niet je posts veranderen als ik een antwoord typ! ;) In ieder geval kan ik me een stuk beter vinden met je nieuwe antwoord, zoiets zou ik waarschijnlijk ook maken.
Link naar reactie
[quote:9f7b666528="Wiep Corbier"]Maar neem van mij aan mijn oplossing de meest gangbare is. [/quote:9f7b666528] Neem van mij dan maar aan dat dit absoluut niet de meest gangbare manier is. En mocht dat wel zo zijn dan mogen de breinen hierachter wat mij betreft op de brandstapel en vreet ik alle sql boeken op die ik in mijn omgeving kan vinden ;) :D Een PK hoort de data te identificeren en verder geen betekenis te hebben. Deze zou nooit gewijzigd moeten kunnen worden en bij jouw voorbeeld kan ik me wel voorstellen dat dat best ooit zal moeten gebeuren. En wat dan? Toevoegen van een "echte" PK zorgt dat je daar nooit tegenaan loopt. Simpel [i:9f7b666528]shirt [/i:9f7b666528]wijzigen in [i:9f7b666528]t-shirt [/i:9f7b666528]is dan een fluitje van een cent.
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen


×
×
  • Nieuwe aanmaken...