Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrere LEFT JOINs auf selbe Tabelle abkürzen

Einklappen

Neue Werbung 2019

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

  • Mehrere LEFT JOINs auf selbe Tabelle abkürzen

    Hi,

    ich steh grad irgendwie voll auf dem Schlauch :-/
    Beim dazujoinen von Produktattributen ... da muss es doch irgend ne Kurzschreibweise/Möglichkeit zum verkürzen geben oder? Dass sieht doch sonst irgendwie seltsam aus, wenn ich 20 und mehr Attribute joine?

    PHP-Code:
    SELECT
        p
    .id,
        
    p.ext_id,
        
    p.name,
        
    ifnull(a1.value'n/a') AS color,
        
    ifnull(a2.value'n/a') AS material,
        
    ifnull(a3.value'0') AS width,
        
    ifnull(a4.value'0') AS height,
        
    ifnull(a5.value'0') AS depth,
        
    #...
    FROM
        products 
    AS p
    LEFT JOIN
        attributes 
    AS a1 ON p.id a1.related_id AND a1.deleted AND a1.relation 'products' AND a1.attribute 'color'
    LEFT JOIN
        attributes 
    AS a2 ON p.id a2.related_id AND a2.deleted AND a2.relation 'products' AND a2.attribute 'material'
    LEFT JOIN
        attributes 
    AS a3 ON p.id a3.related_id AND a3.deleted AND a3.relation 'products' AND a3.attribute 'width'
    LEFT JOIN
        attributes 
    AS a4 ON p.id a4.related_id AND a4.deleted AND a4.relation 'products' AND a4.attribute 'height'
    LEFT JOIN
        attributes 
    AS a5 ON p.id a5.related_id AND a5.deleted AND a5.relation 'products' AND a5.attribute 'depth'
    #... 
    Schonmal Danke fürs lösen vom Knoten in meinem Kopf ... der platzt sonst noch

    Grüsse - Stef
    Heilung bei codebedingtem Augenkrebs

  • #2
    Hint: es gibt neben den Join-Conditions auch noch Where-Conditions, die man durchaus verwenden kann.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Moin =) Ich möcht in dem Fall bewusst keine INNER JOINs draus machen. Hintergrund bzw wozu das dienen soll ist ...

      -> Ein "Anwender" soll wahlweise über eine UI oder durch eine entprechende Anfrage an die API eine Liste von bspw. Produkten erhalten können.
      -> Der Anwender soll dabei die Möglichkeit haben, ausgwählte Attribute, ... mit zu exportieren/erhalten. Diese können wiederum als Pflicht (inner join) definiert werden ... oder eben auch als optional (left join).
      -> Für optionale Werte/Attribute soll für jedes davon ein wiederum optionaler Default Wert angegeben werden können, der bei Nichtvorhandensein eines Attributes gesetzt wird, ...

      Bspw. sinngmäss könnte eine anfrage dann so aus sehn
      Code:
      <?xml version="1.0" encoding="utf-8"?>
      <GetProducts>
          ... welche Felder ...
          <AdditionalTables>
              <Table>
                  <Name>attributes</Name>
                  <Fields>
                      <Field>
                          <Name>color</Name>
                          <Mandatory>1</Mandatory>
                          <Default>0.00</Default>
                          ... evtl. weitere Optionen ...
                      </Field>
                  </Fields>
              </Table>
          </AdditionalTables>
      </GetProducts>
      Viele Grüße - Stef
      Heilung bei codebedingtem Augenkrebs

      Kommentar


      • #4
        Ich weiß jetzt nicht, was die Join Form / Where Bedingung an Deinem Problem ändert. Kernfrage wäre für mich, muss das Produkt in einer Zeile stehen und ist es immer/hauptsächlich diese Attributtabelle?
        Dürften mehrere Zeilen je Produkt rauskommen, könntest Du tatsächlich mit einfachem Join und gezieltem Where Filter SQL-Text "sparen".
        Ist dem nicht so und geht es um hauptsächlich eine Attribut-Tabelle in der Modellierung wie Du beschrieben hast, ist das m.E. ein Fall für eine Kreuzabfrage / Pivotabfrage.
        Hier ist mysql leider nicht sehr stark, um es mal vorsichtig auszudrücken, aber es gibt schräge workarounds dafür. Wahrscheinlich kriegt man keinen Geschwindigkeitsrausch, aber ich vermute mal, Du baust das nicht für 60 Mio Amazon Produkte. Könnte also klappen bzw. ausreichen:

        Idee in SO
        http://stackoverflow.com/questions/7...ql-pivot-table

        sqlfiddle beispiel dazu
        http://sqlfiddle.com/#!2/0a068/6

        Kommentar


        • #5
          Zitat von Perry Staltic Beitrag anzeigen
          Ich weiß jetzt nicht, was die Join Form / Where Bedingung an Deinem Problem ändert.
          Das war nur darauf bezogen, dass das "Verschieben" von den Conditionals aus dem JOIN runter in den where clause aus einem LEFT ja grundsätzlich erstmal einen INNER JOIN join macht, wenn ich nicht überall ein OR IS NULL dranhänge. Das wäre dann auch nicht übersichtlicher / einfacher.

          Es darf immer nur eine Zeile/Produkt sein. Das Beispiel sieht aber schon mal aus wie das was was ich brauche =) Pivotabfragen sind jezz so garnicht meine Stärke, aber es wirkt sehr kompakt und gefällt mir =) Nein nein ... das sind bestenfalls 1,000 bis schlimmstenfalls vielleicht mal 50,000 Produkte mit max 30-40 Attributen. Von daher könnte das glaub schon passen =) Danke Dir.

          Viele Grüße - Stef

          Heilung bei codebedingtem Augenkrebs

          Kommentar


          • #6
            Zitat von nimmneun Beitrag anzeigen
            Das war nur darauf bezogen, dass das "Verschieben" von den Conditionals .. Das wäre dann auch nicht übersichtlicher / einfacher.
            Eben, galt auch eigentlich nicht Dir.
            Zitat von nimmneun Beitrag anzeigen
            ..nicht meine Stärke, aber es wirkt sehr kompakt und gefällt mir
            Ok, aber aufgepasst, das "sehr kompakte" dient ja nur der Erzeugung des eigentlichen Statements. Schau mal in die Zwischenergebnisse der SQL Variable und überleg Dir, ob das für Dich taugt. Und prüf es gründlich mit realen Daten/-mengen.




            Kommentar

            Lädt...
            X