Announcement

Collapse
No announcement yet.

SQL Abfrage problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Abfrage problem

    Hallo liebe Gemeinde

    ich bin mir jetzt nicht sicher, ob ich das gut erklären kann,
    irgendwie bekomme ich es nicht hin die drei Tabellen endgültig zu verknüpfen

    ich würde gerne mit einem Select ausgesuchte Spalten aus Tabelle 1 & 2 mischen und die verschiedenen IDs von test_col und base_col duch den dazugehörigen Text aus der Tabelle FARBE erstetzen

    Tabelle 1 (PL8_TRADE alias PL8_T) besitzt folgende Spalten:
    id (int, unique)
    id_main (int)
    test_col (int)
    pic_trade (string)

    Tablle 2 (PL8_MAIN alias PL8_M)
    id (int, unique)
    base_col (int)

    Tabelle 3 (FARBE)
    id (int, unique)
    Text (String) z.B. rot


    mein Vorschlag

    SELECT PL8_T.id, test_col.Text , PL8_T.pic_trade, base_col.Text
    FROM PL8_TRADE AS PL8_T, PL8_MAIN AS PL8_M
    LEFT JOIN FARBE AS test_col ON PL8_T.test_col=test_col.id
    LEFT JOIN FARBE AS base_col ON PL8_M.base_col=base_col.id
    WHERE PL8_M.id = PL8_T.Id_item ORDER BY test_col.Text

    und eigentlich sollte er jetzt zu jedem Eintrag aus Tabelle 1 für die id aus test_col den richtigen Farbnamen einsetzen
    aber seine Meldung ist: #1054 - Unknown column 'PL8_T.test_col' in 'on clause'
    wenn ich nur einen LEFT JOIN (egal welchen) mache und die zweite Farbspalte als id aufliste geht es
    aber zwei LEFT JOINS macht er nicht
    ich vermute es liegt irgendwie an meinem FROM Terminus

    hat jemand eine Idee?
    wäre klasse, denn mir sind die Ideen langsam ausgegangen :-(

    gruß
    Zen

  • #2
    Erstmal: Warum machst du mit PL8_M und PL8_T keinen left join? Dann würde ich für die Aliasse Kleinbuchstaben verwenden und danach den Code noch mit [highlight=sql]<Code>[/highlight] formatieren, dass man ihn hier lesen kann
    So auf den ersten Blick sieht das Statement eigentlich richtig aus. Ersetze mal den handgemachten JOIN, den in dem das Statement im WHERE Block steht, durch einen richtigen. Dürfte zwar eigentlich nichts ändern, ist aber definitiv besser lesbar. Aber vielleicht hilfts ja.
    Vielleicht macht auch der underscore in den aliassen Probleme.

    Schließlich wäre noch interessant welche DB du benutzt.

    Comment


    • #3
      Originally posted by ZENeca View Post
      mein Vorschlag

      SELECT PL8_T.id, test_col.Text , PL8_T.pic_trade, base_col.Text
      FROM PL8_TRADE AS PL8_T, PL8_MAIN AS PL8_M
      LEFT JOIN FARBE AS test_col ON PL8_T.test_col=test_col.id
      LEFT JOIN FARBE AS base_col ON PL8_M.base_col=base_col.id
      WHERE PL8_M.id = PL8_T.Id_item ORDER BY test_col.Text
      Da kann ich fanderlf nur Recht geben, das kann niemand lesen.

      Hier gibt's einen online formatter (1. Treffer aus google)
      http://www.dpriver.com/pp/sqlformat.htm

      Ergebnis:
      [highlight=sql]
      SELECT pl8_t.id,
      test_col.TEXT,
      pl8_t.pic_trade,
      base_col.TEXT
      FROM pl8_trade AS pl8_t,
      pl8_main AS pl8_m
      LEFT JOIN farbe AS test_col
      ON pl8_t.test_col = test_col.id
      LEFT JOIN farbe AS base_col
      ON pl8_m.base_col = base_col.id
      WHERE pl8_m.id = pl8_t.id_item
      ORDER BY test_col.TEXT
      [/highlight]

      Wenn ich mich nicht vertue, hast Du den Table Alias für [FARBE] exakt wie einen existierenden Spaltennamen genannt. Das ist vielleicht problematisch.
      Gruß, defo

      Comment


      • #4
        erst mal besten Dank zu den ersten Hinweisen
        ich habe auch viel herumprobiert, komme aber immer noch auf keinen grünen Zweig.

        Also, als erstes handelt es sich leider nur um ein mySQL,
        ich hoffe mal, das sich damit nicht alles ändert
        wenn ich mir die Versionsvariablen zeigen lasse bekomme ich:
        protocol_version 10
        version 5.0.51a-24+lenny5


        okay, okay und sorry,
        ich bin nicht wirklich mit den üblichen SQL-Konventionen vertraut
        Ich habe bis jetzt hauptsächlich die TABELLEN groß geschrieben
        und die Spalten immer klein geschrieben (obwohl ich gerade sehe,
        daß ich da wohl auch nicht ganz konsequent war).
        Für die Alias habe ich es mir nie überlegt, aber ich muß zugeben,
        daß in den ganzen Tutorials und Referenzen diese eigentlich auch immer klein geschrieben wurden, das mit den Tabellen und Spalten kann ich leider nicht so schnell ändern (obwohl ich nicht mal weiß, ob die wirklich case-sensetive abgefragt werden), aber Alias schreibe ich auch gerne klein und, daß ich die Alias bei den Joins gleich den Spaltennamen benannt habe, ist wirklich ein bißchen verwirrend, ich vermute das ist mir passiert,
        weil letztlich die ganze Abfrage immer nur virtuell generiert wird,
        was alles auch noch mal schwieriger macht

        so vielleicht ein bißchen besser?

        [highlight=sql]
        SELECT pl8_t.id, col_2.Text , pl8_t.pic_trade, col_1.Text
        FROM PL8_TRADE_DB AS pl8_t, PL8_DB AS pl8_m
        LEFT JOIN FARBE AS col_1 ON pl8_m.base_col=col_1.id
        LEFT JOIN FARBE AS col_2 ON pl8_t.test_col=col_2.id
        WHERE pl8_m.id = pl8_t.Id_item
        [/highlight]
        funktioniert aber leider auch nicht, wieder die gleiche Meldung:
        #1054 - Unknown column 'pl8_t.test_col' in 'on clause'

        es läßt sich mit der gleichen Fehlermeldung reduzieren auf:

        [highlight=sql]
        SELECT pl8_t.id, col_2.Text , pl8_t.pic_trade, pl8_m.base_col
        FROM PL8_TRADE_DB AS pl8_t, PL8_DB AS pl8_m
        LEFT JOIN FARBE AS col_2 ON pl8_t.test_col = col_2.id
        WHERE pl8_m.id = pl8_t.Id_item
        [/highlight]

        und wie gesagt, das geht:

        [highlight=sql]
        SELECT pl8_t.id, pl8_t.test_col, pl8_t.pic_trade, col_1.Text
        FROM PL8_TRADE_DB AS pl8_t, PL8_DB AS pl8_m
        LEFT JOIN FARBE AS col_1 ON pl8_m.base_col = col_1.id
        WHERE pl8_m.id = pl8_t.Id_item
        [/highlight]

        also gibt es in der pl8_t eine test_col :-|

        @fanderlf
        ich verstehe deinen ersten Vorschlag “Warum machst du mit PL8_M und PL8_T keinen left join?” nicht,
        ich kann die doch nicht einfach doppelt benutzen *grübel

        Underscore bei Alias herausnehmen hat nichts gebracht
        hätte mich auch überrascht, ist es doch das einzige Sonderzeichen,
        das, bei welcher Programmierung auch immer, noch nie Probleme gemacht hat

        @defo
        danke für den Autoformater, aber wie gesagt, die gesamte Abfrage wird
        am Schluß, abhängig einer Konfigurationstabelle, komplett virtuell generiert
        ...oder meintest du jetzt das ich den möglichst für das Forum nutzen sollte?

        ...ich gehe jetzt erst mal schlafen
        cu
        Zen

        Comment


        • #5
          Also ich schreibs jetzt mal so wies ich schreiben würde:

          [highlight=sql]
          SELECT trade.id, color2.Text , trade.pic_trade, color1.Text
          FROM PL8_TRADE_DB AS trade
          INNER JOIN PL8_DB AS main ON main.id = trade.Id_item
          LEFT JOIN FARBE AS color1 ON main.base_col=color1.id
          LEFT JOIN FARBE AS color2 ON trade.test_col=color2.id
          [/highlight]

          Das ist jetzt aber eigentlich Geschmackssache und wird zur Lösung nichts beitragen.

          Meine Vermutung wäre jetzt eigentlich ganz einfach... PL8_TRADE_DB hat keine Spalte test_col. Das ist zumindest das was die Fehlermeldung sagt.

          Funktioniert denn folgendes?

          [highlight=sql]
          SELECT test_col
          FROM PL8_TRADE_DB
          [/highlight]

          Danach mal mit dem Alias von oben probieren. Also:

          [highlight=sql]
          SELECT pl8_t.test_col
          FROM PL8_TRADE_DB AS pl8_t
          [/highlight]

          @Formatierung von Defo: Ich glaube er meinte hier im Forum. Wenn das generierter Code ist braucht das nicht schön auszusehen. Nur wenn ich das lesen muss dann tue ich mich leichter wenn der vernünftig formatiert ist.

          Comment


          • #6
            Hallo,

            die Fehlermeldung "#1054 - Unknown column 'pl8_t.test_col' in 'on clause'" besagt, dass der Bezeichner pl8_t.test_col im aktuellen Kontext unbekannt ist. Das kann zum einen sein, dass es die Spalte test_col in pl8_t überhaupt nicht gibt und zum Anderen, dass sie (bzw. die Tabelle) im aktuellen Kontext nicht bekannt sind. Zweiteres ist bei dir der Fall.

            Du machst eine einfache Auflistung von Tabellen und Joinst diese implizit über die Where-Klausel. Zusätzlich hast du jedoch einen expliziten Join definiert. Dieser bezieht sich jedoch auf:
            [highlight=sql]
            PL8_DB AS pl8_m
            LEFT JOIN FARBE AS col_2 ON pl8_t.test_col = col_2.id
            [/highlight]
            Und in diesem Kontext ist pl8_t einfach ungültig. MySQL kennt an dieser Stelle die Tabelle pl8_t nicht!
            Vertausche in deiner Auflistung einfach mal die beiden Tabellen:
            [highlight=sql]
            FROM PL8_DB AS pl8_m, PL8_TRADE_DB AS pl8_t
            [/highlight]
            Oder verwende einfach korrekte Klammersetzung!
            [highlight=sql]
            FROM (PL8_TRADE_DB AS pl8_t, PL8_DB AS pl8_m)
            LEFT JOIN FARBE AS col_2 ON pl8_t.test_col = col_2.id
            [/highlight]


            Insofern wird - oh Wunder (und auch wenn er es selbst nicht glaubt) - auch die von fanderlf vorgenommene explizite Formulierung des Join funktionieren.

            Also wiedermal ein Anwendungsfall dafür, dass man nie explizite und implizite Joins mischen sollte.

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              ach ja richtig jetzt check ichs auch...

              der macht praktisch einen JOIN über die ganzen Tabellen hinter dem Komma und danach erst das "Kreuzprodukt" mit pl8_t. Dann ist natürlich pl8_t in dem JOIN hinter dem Komma nicht bekannt.

              Eigentlich logisch *lach* Also doch meine Variante mit dem INNER JOIN verwenden.

              Comment


              • #8
                Ja, ich meinte Formatierung nur bezogen auf die Darstellung im Forum (und was man sich selber so zumutet). Durch die Highlight Funktion hier, reduziert sich die Anforderung ja lediglich auf das Einrücken.
                Groß/Kleinschreibung ist mir eigentlich auch wurscht, da es seit einigen Jahren ja fast selbstverständlich geworden ist, dass Schlüsselwörter, Texte, Kommentare und Zahlen automatisch farbig dargestellt werden.
                Ob der Parser das schön findet, ist mir egal.

                Aber (bin da nicht so sattelfest bei mySQL):
                Ist nicht Groß/Kleinschreibung bei Tabellen und Tabellen-Alias ein Thema bei mySQL (zumindest unter Unix)?
                Gruß, defo

                Comment


                • #9
                  Originally posted by defo View Post
                  Ist nicht Groß/Kleinschreibung bei Tabellen und Tabellen-Alias ein Thema bei mySQL (zumindest unter Unix)?
                  Zumindest die Datenbank-/Tabellennamen bei MyISAM, da das Dateisystem bei *nix die Groß-/Kleinschreibung unterscheidet.
                  Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

                  Comment


                  • #10
                    Hallo Leute,

                    also vorab besten dank für eure schnelle und erfolgreiche Hilfe
                    auf die Klammern wäre ich im Leben nicht gekommen,
                    da fehlt mir wohl einfach noch die Erfahrung und
                    ich habe mir meine gesamten SQL-Kenntnisse auch nur selber "druffgeschafft"

                    aber ich muß mich auch ein bißchen loben,
                    denn immerhin habe ich schon bei meinem ersten Thread geschrieben:

                    Originally posted by ZENeca View Post
                    wenn ich nur einen LEFT JOIN (egal welchen) mache und die zweite Farbspalte als id aufliste geht es
                    aber zwei LEFT JOINS macht er nicht
                    ich vermute es liegt irgendwie an meinem FROM Terminus
                    damit habe ich ja schon gewußt, daß es nicht an der scheinbar fehlenden Spalte liegt
                    und hatte auch eine Ahnung wo der Fehler zu suchen ist.

                    Wie auch immer, ich habe je bei der Gelegenheit schon einiges an der Namensgebung geändert,
                    aber jetzt einfach die JOINS von LEFT auf LEFT/INNER umzustellen geht nicht so ohne weiteres,
                    denn die SQL-Statements sind bei mir ja nicht einfach hardcodiert,
                    sondern werden zu jeder Tabelle, je nach Aufbau virtuell erzeugt,
                    es können auch mal 2, 3 oder 4 JOINS sein oder auch keiner,
                    nur spalten einer Tabelle oder auch mal, wie im Thread, aus zwei Tabellen gemischt,
                    je nachdem welche Spaltentypen in einer entsprechenden Tabelle gefragt sind.
                    Das gelingt mir mit einer nicht gerade trivialen php-Routine
                    und dafür erscheint mir eine systematische Lösung mit der Liste in einer Klammer
                    und die entsprechende Liste von JOINS erst mal als gut geeignet oder spricht irgend etwas konkret dagegen?
                    Aber irgendwie verstehen würde ich schon ganz gerne, warum fenderlf’s
                    Lösung das gleiche bewirken soll, muß ich mir noch mal in Ruhe anschauen.

                    Also, besten Dank noch mal für das erste,
                    möchte nicht ausschließen, daß wir uns hier noch mal treffen

                    CU
                    Zen

                    Comment


                    • #11
                      Aber irgendwie verstehen würde ich schon ganz gerne, warum fenderlf’s
                      Lösung das gleiche bewirken soll, muß ich mir noch mal in Ruhe anschauen.
                      Das liegt an der Rangfolge (wia in der Mathematik Punkt vor Strich).
                      http://dev.mysql.com/doc/refman/5.1/de/join.html

                      Früher hatten der Kommaoperator (,) und JOIN dieselbe Rangstufe, d. h., der Join-Ausdruck t1, t2 JOIN t3 wurde als ((t1, t2) JOIN t3) interpretiert. Jetzt hat JOIN Vorrang vor dem Komma, d. h., der Ausdruck wird als (t1, (t2 JOIN t3)) ausgewertet. Diese Änderung betrifft Anweisungen, die eine ON-Klausel verwenden, denn diese Klausel kann nur Spalten in den Operanden des Joins referenzieren, und die Änderung in der Rangstufe wirkt sich darauf aus, wie interpretiert wird, was diese Operanden sind.

                      Beispiel:

                      Code:
                      CREATE TABLE t1 (i1 INT, j1 INT);
                      CREATE TABLE t2 (i2 INT, j2 INT);
                      CREATE TABLE t3 (i3 INT, j3 INT);
                      INSERT INTO t1 VALUES(1,1);
                      INSERT INTO t2 VALUES(1,1);
                      INSERT INTO t3 VALUES(1,1);
                      SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);
                      In älteren Versionen war die SELECT-Anweisung aufgrund der impliziten Gruppierung von t1,t2 als (t1,t2) zulässig. Jetzt hat JOIN Vorrang, d. h., die Operanden für die ON-Klausel sind t2 und t3. Da t1.i1 keine Spalte in einem der Operanden ist, ist das Ergebnis der Fehler Unknown column 't1.i1' in 'on clause'. Um die Verarbeitung des Joins zuzulassen, gruppieren Sie die ersten beiden Tabellen explizit mithilfe von Klammern, sodass die Operanden für die ON-Klausel (t1,t2) und t3 sind:

                      Code:
                      SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
                      Alternativ umgehen Sie die Verwendung des Kommaoperators und verwenden stattdessen JOIN:

                      Code:
                      SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);
                      Diese Änderung gilt auch für INNER JOIN, CROSS JOIN, LEFT JOIN und RIGHT JOIN: Sie alle haben nun Vorrang vor dem Kommaoperator.
                      Also am besten ist es die Theta-Joins (kommasepariert) so schnell wie möglich zu vergessen und nur noch mit expliziten Joins zu arbeiten.
                      Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

                      Comment

                      Working...
                      X