Announcement

Collapse
No announcement yet.

Probleme mit einer Select abfrage

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

  • Probleme mit einer Select abfrage

    habe folgende Select Abfrag
    Code:
    SELECT 
        katalog.Bezeichnung_ID, 
        katalog.Katalog_ID, 
        katalog.OZ, 
        katalog.Bezeichnung as Kat_Bez, 
        katalog.Artikell, 
        katalog.Bestell, 
        lieferant.Lieferant
    FROM 
       katalog,
       lagerstand,
       lieferant
    LEFT JOIN 
        bezeichnung 
    ON 
        katalog.Bezeichnung_ID=bezeichnung.Bezeichnung_ID
    WHERE 
       lagerstand.Katalog_ID=katalog.Katalog_ID 
    AND katalog.Lieferant_ID=lieferant.Lieferant_ID 
    AND katalog.Gruppe_ID=6
    AND lagerstand.Lagerplatz_ID NOT LIKE '83'
    AND lagerstand.Ausg NOT LIKE 'J'
    PHPMyAdmin meldet aber jetzt diesen Fehler
    #1054 - Unknown column 'katalog.Bezeichnung_ID' in 'on clause'

    Diese Spalte besteht aber wo habe ich den Denkfehler

    mfg Peter

  • #2
    Hallo,

    du joinst lieferant mit bezeichnung und in diesem Kontext gibt es keine katalog.Bezeichnung_ID!
    Warum mischst du explizite und implizite Joins? Das macht deine Abfrage schwer lesbar und führt zu Fehlern - wie du siehst. Formuliere alle Joins explizit und du wirst sehen wo dein Denkfehler ist.

    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


    • #3
      Code:
      Select 
          katalog.katalog_ID, 
          katalog.OZ,katalog.Bezeichnung as Kat_Bez, 
          bezeichnung.Bezeichnung, 
          katalog.Artikell,katalog.bestell,
          lieferant.Lieferant 
      FROM 
         lagerstand,
         katalog
      Left Join 
          bezeichnung 
      ON 
          bezeichnung.Bezeichnung_ID=katalog.Bezeichnung_ID
      Left Join 
          lieferant 
      ON 
          lieferant.Lieferant_ID=katalog.Lieferant_ID
      WHERE 
          lagerstand.Katalog_ID=katalog.Katalog_ID 
      AND 
          lagerstand.Lagerplatz_ID NOT LIKE 82 
      AND 
          lagerstand.Ausg NOT LIKE 'J' 
      AND 
          katalog.Gruppe_ID=6
      Habe die Abfrage jetzt Umgeschrieben Funktioniert jetzt so wie ich will

      Heist der LEFT JOIN bezieht sich auf die Letzte Tabelle die nach dem From kommt.

      Ich muss auch gestehen das diese Art der Abfrage für mich sehr neu ist
      habe füher die abfrage so gestaltet

      Select * from lagerstand Where lagerstand.Lagerplatz_ID NOT LIKE 82 AND lagerstand.Ausg NOT LIKE 'J'

      $Kalatog_ID=WERT AUS LAGERSTAND TABELLE

      und dann natürlich den Katalog eintrag ausgelesen

      Select * from katalog WHERE Katalog_ID=$Katalog_ID
      usw.
      mfg Peter

      Comment


      • #4
        Hallo,

        du vermischst immer noch explizite und implizite Joins!

        Warum nicht:
        [highlight=sql]
        Select
        katalog.katalog_ID,
        katalog.OZ,katalog.Bezeichnung as Kat_Bez,
        bezeichnung.Bezeichnung,
        katalog.Artikell,katalog.bestell,
        lieferant.Lieferant
        FROM
        lagerstand
        inner join katalog
        on katalog.Lieferant_ID = lagerstand.Katalog_ID
        Left Join bezeichnung
        ON bezeichnung.Bezeichnung_ID=katalog.Bezeichnung_ID
        Left Join lieferant
        ON lieferant.Lieferant_ID=katalog.Lieferant_ID
        WHERE
        lagerstand.Lagerplatz_ID != 82
        AND
        lagerstand.Ausg != 'J'
        AND
        katalog.Gruppe_ID = 6
        [/highlight]

        Anmerkung: Die Beziehungen bezeichnung.Bezeichnung_ID=katalog.Bezeichnung_ID und lieferant.Lieferant_ID=katalog.Lieferant_ID sehen nach Fremdschlüsselbeziehungen aus. Gibt es da tatsächlich Kombinationen, die den LEFT JOIN rechtfertigen oder ist das sowieso in jedem Fall ein INNER JOIN?
        Man sollte nicht LEFT JOINs formulieren die keine sind!
        Auch sollte man kein LIKE auf numerische Werte anwenden. Und ein LIKE bzw. dessen Umkehrung macht ohne die Verwendung eines Platzhalters (%, ?) auch keinen Sinn!

        Für ein "lagerstand.Lagerplatz_ID NOT LIKE 82" wandelt der Server beide Seiten implizit in einen String um und vergleicht diese dann mit der LIKE-Engine und kann deshalb u.U. keinen Index verwenden. Der numerische (indexgestützte) Vergleich ist hier (sehr) viel schneller.

        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


        • #5
          Die Beziehung bezeichnung.Bezeichnung_ID=katalog.Bezeichnung_ID
          ist auf alle fälle ein Left Join

          Im Katalog kann ich hier einen Wert hinterlegen muss dies aber nicht
          aber der Katalog Eintrag soll auf alle fälle Angezeigt werden

          Die Beziehung lieferant.Lieferant_ID=katalog.Lieferant_ID
          ist ein Inner Join da auf alle Fälle ein Wert im Katalog hinterlegt sein muss

          und genauso verhält sich das auch mit Lagerstand zu Katalog
          in der Tabelle Lagerstand ist auf alle fälle eine Katalog_ID hinterlegt

          vielen Dank mal dafür

          kennt vieleicht noch jemand eine gute Seite die sich mit Joins auseinandersetzt
          aber nicht nur mit beispielen von Zwei Tabellen sondern ich sag mal 10 Tabellen??

          mfg Peter

          Comment


          • #6
            Originally posted by Lucifer21 View Post
            ...kennt vieleicht noch jemand eine gute Seite die sich mit Joins auseinandersetzt
            aber nicht nur mit beispielen von Zwei Tabellen sondern ich sag mal 10 Tabellen??
            Was ist bei 10 Tabellen anders als bei Zwei? (Mal abgesehen von der Anzahl der Tabellen und der Schreibarbeit) Der prinzipielle Aufbau ist doch immer gleich. Und gerade bei mehreren Tabellen sollte man darauf achten, die Joins sauber auszuformulieren, sonst verliert man schnell den Überblick!
            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

            Working...
            X