SQL select INNER JOIN / LEFT JOIN

    • SQL select INNER JOIN / LEFT JOIN

      Goedemiddag,

      ik loop vast op het maken van tags voor een Blog post. Nu heb ik rond gekeken naar oude topics, en ik kwam er een aantal tegen van Luc over een ziekenhuis, echter is het me niet gelukt om met de kennis die daar in gedeeld werd het te bouwen(dat ligt aan mij) Excuses hiervoor.

      Ik maak gebruik van 3 tables"-" met daar in de volgende columns"*":

      - blog
      * id
      * parent_id
      * title
      * sub_title
      * quote
      * header_image
      * image_link
      * video link
      * description
      * post_date
      * num_comments

      - tags
      * id
      *tag_name

      - taxonomy
      * id
      * blog_post
      * tag_id

      Nu wilde ik de tags per blog koppelen als het id vanuit de table blog overeen komt met blogpost_id uit de Taxonomy table. Echter krijg ik een error op lijn 12 bij (INNER JOIN). Hopelijk kan iemand mij verder helpen.


      PHP Source Code

      1. <ul class="blog-tags-list f-left">
      2. <?php
      3. $sql = "
      4. SELECT
      5. blog.id,
      6. tags.tag_name,
      7. taxonomy.blog_post
      8. FROM
      9. blog
      10. LEFT JOIN
      11. tags
      12. INNER JOIN
      13. taxonomy
      14. ON blog.id = taxonomy.blog_post";
      15. $result = mysqli_query($db, $sql);
      16. if (!$result = $db->query($sql)) {
      17. die ('There was an error running query[' . $db->error . ']');
      18. }
      19. while($row = mysqli_fetch_assoc($result))
      20. {
      21. $id = $row["id"];
      22. $blog_post = $row["blog_post"];
      23. $tag_name = $row["tag_name"];
      24. ?>
      25. <li><a href="#"><?php echo $row['tag_name'];?></a></li>
      26. <?php
      27. }
      28. ?>
      29. </ul>
      Laat alles zien
    • Maar de pagina waar je deze informatie ophoest, wat zou deze weer moeten geven? Wat voor doel dient deze?

      Is dit een pagina met een overzicht van blogs met bijbehorende tags?
      Is dit een pagina met een specifieke blog (in welk geval er een WHERE-conditie mist)?
      Is dit een pagina met een overzicht van tags met bijbehorende blogs?

      Je zou ook eerst een query kunnen maken waarin je de tags opslaat in een array tag-id => tag-naam.
      En vervolgens voer je een query op blogs uit waarin je de tags GROUP_CONCAT zodat je niet tig rijen per blog terugkrijgt.

      Maar hoe je dit (in code en op je scherm) vormgeeft wordt in eerste instantie bepaald door wat voor doel de pagina heeft.

      Los hiervan zul je in je JOINs aan moeten geven hoe je tabellen aan elkaar fietst. Na LEFT JOIN tags wordt waarschijnlijk een JOIN-conditie (ON a.id = b.id) verwacht want deze lijkt verplicht.
    • Bedankt voor uw reactie FangorN,

      ik wilde de tags op een pagina van een specifieke Blog post tonen. Dus eigenlijk links van de tekst Tags: "zie de afbeelding".

      Mijn bedoeling was om straks mijn collega's de mogelijkheid te geven om via het CMS enkele tags per blog/vlog toe te wijzen.

      De koppeling die ik nu had bedacht "correct me if i am wrong" als blog $id = $blog_post geef dan tag_name weer bij die specifieke blog.

      Maar zo als ik uit uw advies lees moet ik mij eerst maar is beter verdiepen in hoe ik ze met elkaar verbindt. Bedankt in ieder geval tot zo ver.

    • Maar als je op de pagina van een specifieke blog post zit dan zal er dus op een of andere manier een blog id bekend moeten zijn.

      Als het geen probleem is om voor het ophalen van de tags een aparte query uit te voeren dan kan dit met een eenvoudige query waarbij je enkel de tags- en taxonomy-tabel gebruikt, de blogs-tabel hoef je in dat geval niet te betrekken in je query.

      Het zal dan zoiets worden als:

      SELECT tg.id, tg.tag_name
      FROM tags tg
      INNER JOIN taxonomy tx ON tx.tag_id = tg.id
      WHERE tx.blog_post = <id van huidige blog-post>
    • Beste FagorN,

      bedankt voor uw hulp, nu worden de tags goed weergegeven.

      PHP Source Code

      1. <ul class="blog-tags-list f-left">
      2. <?php
      3. $id = intval($_GET['id']);
      4. $sql = "
      5. SELECT tg.id, tg.tag_name
      6. FROM tags tg
      7. INNER JOIN taxonomy tx ON tx.tag_id = tg.id
      8. WHERE tx.blog_post = $id";
      9. $result = mysqli_query($db, $sql);
      10. if (!$result = $db->query($sql)) {
      11. die ('There was an error running query[' . $db->error . ']');
      12. }
      13. while($row = mysqli_fetch_assoc($result))
      14. {
      15. ?>
      16. <li><a href="#"><?php echo $row['tag_name'];?></a></li>
      17. <?php
      18. }
      19. ?>
      20. </ul>
      Laat alles zien
    • Goedemiddag,

      Op dit moment werk ik aan een product-detail pagina waar ik vanuit verschillende tables informatie wil tonen op $id. Nu loop ik op dit moment tegen het probleem aan dat ik via mijn LEFT JOIN de error: "Undefined index variable krijg".

      De tables waar ik op dit moment data wil halen:
      - products
      - productimages

      table productimages bevat de columns:
      - id
      - pimage_id
      - img
      - p_id

      Nu gaat het bij de table products goed maar de variable uit de table productimages geven de errormelding als ik ze probeer weer te geven!

      HTML Source Code

      1. <div class="col-md-5 col-sm-5 col-xs-12">
      2. <div class="imgs-zoom-area">
      3. <img id="zoom_03" src="<?php echo $row['img'];?>" data-zoom-image="<?php echo $row['img'];?>" alt="">
      4. <div class="row">
      5. <div class="col-xs-12">
      6. <div id="gallery_01" class="carousel-btn slick-arrow-3 mt-30">
      7. <div class="p-c">
      8. <a href="#" data-image="<?php echo $row['img'];?>" data-zoom-image="<?php echo $row['img'];?>">
      9. <img class="zoom_03" src="<?php echo $row['img'];?>" alt="">
      10. </a>
      11. </div>
      12. </div>
      13. </div>
      14. </div>
      15. </div>
      16. </div>
      Laat alles zien




      PHP Source Code

      1. <?php
      2. $id = intval($_GET['id']);
      3. $sql = "SELECT pd.id, pd.parent_id, pd.sku, pd.brand, pd.category, pd.title, pd.sub_title, pd.content, pd.price, pd.gross_price, pd.ean_code
      4. FROM products pd
      5. LEFT JOIN productimages pi ON pd.id = pi.pimage_id
      6. WHERE pi.pimage_id = '$id'";
      7. $result = mysqli_query($db, $sql);
      8. if (!$result = $db->query($sql)) {
      9. die ('There was an error running query[' . $db->error . ']');
      10. }
      11. while($row = mysqli_fetch_assoc($result))
      12. {
      13. ?>
      Laat alles zien

      Post werd 1x aangepast, het laatst door Marijn ().

    • Wat is het verschil tussen pimage_id en p_id in de productimages tabel en weet je zeker dat je inderdaad wilt joinen op pimage_id (en niet iets anders, bijvoorbeeld p_id)?

      En als pimage_id inderdaad de foreign key is naar products is dat nou niet bepaald een fantastisch gekozen naam :/.

      Verder is het denk ik in het algemeen handiger om te refereren aan primary keys in je WHERE-conditie, in plaats van foreign keys, dat schept meestal wat sneller duidelijkheid over wat de query zou moeten doen.

      Dat gezegd hebbende, hoe ziet je dataset er uit, welke resultaten verwacht je die je niet krijgt?

      En van wat voor engine maken de tabellen gebruik? MyISAM? InnoDB? Als je een SHOW CREATE TABLE doet op zowel products alsook productimages, wat voor resultaten krijg je dan terug?

      En als je LEFT JOIN gebruikt dan kunnen resultaten NULL-waarden bevatten, controleer je hier ook op? Dump voor de gein (je) $row(s) eens.