Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

Join tussen drie tabellen lukt niet

None
43 antwoorden
  • 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
  • [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]
  • 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
  • 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
  • [quote:b64a9e302e="Wiep Corbier"]Mag je shirt zomaar in de sql plaatsen? Moeten daar geen quotes omheen?[/quote:b64a9e302e]Dit staat los van PHP aangezien de query gewoon wordt losgelaten op de MySQL database. Dus er moeten idd quotes omheen, alleen om nummerieke waarden hoeven (mogen?) geen quotes.

    - Bas
  • 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
  • [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]
  • Tja, ik blijf een koppeltabel een vreemde constructie vinden.
    Ik gebruik het dus zelf nooit.
  • Hoe neem jij dan een N-M relatie op in je datamodel? :-?
  • Niet.

    Ik heb wel eens voorbeelden gezien waar het nuttig was, maar heb het zelf nog nooit hoeven gebruiken.
  • 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.
  • 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, 1[/color:0920ad100e], Shirt
    2, 1[/color:0920ad100e], Bal
    3. 1[/color:0920ad100e], Clubblad
    4, 2, Bal
    5, 3[/color:0920ad100e], Shirt
    6, 3[/color:0920ad100e], Bal
    7, 3[/color:0920ad100e], Reclamebord.
  • @Wiep

    Je voert nu wel redundantie in je tabel in. Termen als "Bal" en "Shirt" zijn hiervan een duidelijk voorbeeld in jouw stukje code. Op zich is het wel te overzien, maar het neemt niet weg dat een N-M relatie een "betere" methode is aangezien het de redundantie vermindert.

    - Bas
  • 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.
  • 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
  • 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
  • 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.
  • [quote:c604a1ee87]Hé Wiep, niet je posts veranderen als ik een antwoord typ![/quote:c604a1ee87]

    Sorry, maar ik wilde het even duidelijk aangeven. :lol:

    ps ik zou ook nog een tabelletje met 'gemeentenamen' hebben volgens hetzelfde idee als tabel 3.
    Die gebruik ik dan in tabel 1.
  • [quote:a3c80271db="BasHamar"]alleen om nummerieke waarden hoeven (mogen?) geen quotes.
    - Bas[/quote:a3c80271db]

    Mag wel, hoeft niet :)

    Het kan natuurlijk wel verschil uitmaken voor mysql:

    1 + 1 maakt 2
    '1 + 1' is gewoon een string '1 + 1'

    maar dat wist je vast wel.
  • [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.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.