Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] WHERE IN mit LEFT JOIN

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] WHERE IN mit LEFT JOIN

    Hallo ich habe drei Tabellen:

    Tabelle 1: "com_shop_products" mit Daten über das Produkt
    Tabelle 2: "com_shop_products_lg" mit Daten über das Produkt -> Sprachen
    Tabelle 3: "com_shop_product_category" produkt_id, category_id
    Tabelle 4: "com_shop_categories" Kategory Daten

    Info:
    Man kann jedes Produkt inaktive schalten sowie jede Kategorie. Wenn man die Kategorie inaktive schaltet sollten auch alle Produkte welche zu dieser Kategorie zugeteilt sind inaktive sein, heisst werden nicht aus der Datenbank geholt. Natürlich auch wenn man nur das Produkt inaktive schaltet. Ausserdem sollte es auch gehen wenn das Produkt zu keiner Kategorie angeordnet ist.


    Nun bei einer Produkt Abfrage klappt das wunderbar mit LEFT JOIN:
    PHP-Code:
    'SELECT p.id, pl.description FROM com_shop_products p, com_shop_products_lg pl
    LEFT JOIN com_shop_product_category pc on :id = pc.product_id
    LEFT JOIN com_shop_categories c on pc.category_id = c.id
    WHERE p.id = pl.id AND p.id = :id AND pl.language_id = :language_id 
    AND (c.public = 1 OR c.public is null)' 

    Doch bei einer Abfrage mit WHERE IN scheint dies nicht mehr zu funktionieren:
    PHP-Code:
    'SELECT p.id, pl.description FROM com_shop_products p, com_shop_products_lg pl
    LEFT JOIN com_shop_product_category pc on pc.product_id IN ('
    .implode(','$ids).')
    LEFT JOIN com_shop_categories c on pc.category_id = c.id 
    WHERE p.id IN ('
    .implode(','$ids).') AND p.id = pl.id AND p.public = 1 
    AND pl.language_id = :language_id AND (c.public = 1 OR c.public is null)' 
    Habe da schon einiges ausprobiert geht aber alles nicht. Vielleicht kann mir da jemand einen Tip geben? Besten Dank im voraus.

  • #2
    WHERE IN wird umgewandelt in OR:
    Code:
    SELECT `column` FROM `table` WHERE `id` IN ( 1, 3, 5, 7, 9 );
    
    // wird zu:
    SELECT `column` FROM `table` WHERE
    `id` = 1 OR `id` = 3 OR `id` = 5 OR `id` = 7 OR `id` = 9
    Was Du benötigst liefert Dir imho FIND_IN_SET()
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Was soll den:

      Code:
      LEFT JOIN com_shop_product_category pc on pc.product_id IN ('.implode(',', $ids).')
      Wenn du zwei Tabellen mit einander joinst, musst du auch eine sinnvolle Joinbedingung angeben, sonst kriegst du ein kartesisches Produkt

      Kommentar


      • #4
        Hey danke Euch beiden vielmals für die Tips:

        Und so funktionierts:
        PHP-Code:
        'SELECT p.id, pl.description FROM com_shop_products p, com_shop_products_lg pl
        LEFT JOIN com_shop_product_category pc on pl.id = pc.product_id
        LEFT JOIN com_shop_categories c on pc.category_id = c.id 
        WHERE p.id IN ('
        .implode(','$ids).') AND p.id = pl.id AND p.public = 1 
        AND pl.language_id = :language_id AND (c.public = 1 OR c.public is null)' 
        versuchte auch schon im ersten LEFT JOIN mit: p.id = pc.product_id aber eben nicht mit pl.id.

        Kommentar


        • #5
          Du solltest die Tabelle com_shop_products_lg auch noch per Left Join joinen, dann kannst du auch "AND p.id = pl.id" weglassen.
          Ist dann schneller als.
          Sprich:
          Code:
          SELECT p.id, pl.description FROM com_shop_products p
          JOIN com_shop_products_lg pl ON p.id = pl.id
          LEFT JOIN com_shop_product_category pc on pl.id = pc.product_id
          LEFT JOIN com_shop_categories c on pc.category_id = c.id 
          WHERE p.id IN ('.implode(',', $ids).')  AND p.public = 1 
          AND pl.language_id = :language_id AND (c.public = 1 OR c.public is null)'

          Kommentar


          • #6
            Nein, der inner join ist dort richtig, nur die Schreibweise könnte sinnvollerweise angepasst werden.

            Kommentar


            • #7
              Das war kein Inner Join sondern ein Kartesische Produkt.

              Okay durch die Selektion, war es ein INNER JOIN. Aber ob man hier jetzt LEFT/INNER nimmt, spielt wohl nicht wirklich eine Rolle.

              Kommentar


              • #8
                Jop danke vielmals für den Hinewis.

                Kommentar


                • #9
                  Zitat von Yoshi- Beitrag anzeigen
                  Aber ob man hier jetzt LEFT/INNER nimmt, spielt wohl nicht wirklich eine Rolle.
                  Du nimmst mit einem LEFT JOIN der Datenbank Optimierungsmöglichkeiten. Das wird in dem Fall keine Rolle Spielen, aber wenn man ein falsches Verständnis dafür Entwickelt wird es irgendwann problematisch.

                  Kommentar

                  Lädt...
                  X