NaN: Liste mit nur einer SQL Abfrage abklappern

Die Tabelle 'einheit' : 'id', 'kuerzel' enthält die Einträge:

id kuerzel
1  E
2  F
3  G
4  H
5  I

Folgende Abfrage

SELECT g.schw_als AS schw_als,
         g.lei_als AS lei_als,
         e.kuerzel AS einheit,
         f.bez AS farbe,
         k.kpreis

FROM kpreis k, farbe f, einheit e, gruppe g

WHERE ((k.kpreis * g.lei_als) > 75)
    AND ((k.kpreis * g.schw_als) < 80)
    AND k.farbe = f.id
    AND k.einheit = e.id
    AND k.gruppe = g.id

möchte ich so erweitern, daß ich nur Ergebnisse, die ein oder mehrere 'kuerzel' enthalten, erhalte. Also nur die Ergebnis mit e.kuerzel in {'F', 'I'} oder nur die Ergebnisse mit e.kuerzel in {'G', 'H', 'I'}.
Mit einer Schleife und mehreren SQL Abfragen (WHERE e.kuerzel='X') kein Problem, geht das aber auch mit nur einer SQL Abfrage?

Datenbank: mysql 5.0.32

NaN

  1. Hallo,

    Die Tabelle 'einheit' : 'id', 'kuerzel' enthält die Einträge:

    id kuerzel
    1  E
    2  F
    3  G
    4  H
    5  I

    nett - und wo sind Beispieldatensätze der anderen Tabellen?

    Folgende Abfrage

      
    SELECT  
        g.schw_als AS schw_als,  
        g.lei_als AS lei_als,  
        e.kuerzel AS einheit,  
        f.bez AS farbe,  
        k.kpreis  
    FROM  
        kpreis k  
    INNER JOIN                   -- explizite Joins machen Abfragen meiner  
        farbe f                  -- Meinung nach viel leichter lesbar und  
    ON                           -- trennen wunderbar Join-Bedingungen  
        k.farbe = f.id  
    INNER JOIN  
        einheit e  
    ON  
        k.einheit = e.id  
    INNER JOIN  
        gruppe g  
    ON  
        k.gruppe = g.id  
    WHERE ((k.kpreis * g.lei_als) > 75)     -- und einschränkende WHERE-Klausel  
        AND ((k.kpreis * g.schw_als) < 80)  
    
    

    möchte ich so erweitern, daß ich nur Ergebnisse, die ein oder mehrere 'kuerzel' enthalten, erhalte.

    Diesen Satz verstehe ich nicht, wenn ich ...

    Also nur die Ergebnis mit e.kuerzel in {'F', 'I'} oder nur die Ergebnisse mit e.kuerzel in {'G', 'H', 'I'}.

    ... diese Erklärung dazu lese.

    Wahrscheinlich kannst Du Dein Ziel erreichen. Subselects oder Selfjoins könnten Dir dabei helfen.

    Beispieldaten *aller* Tabellen und das gewünschte Ergebnis, mit der Begründung, warum dies das gewünschte Ergebnis ist, wären hilfreich.

    Freundliche Grüße

    Vinzenz

    1. Gudn Abend (Ist Mainzelmänchenzeit),

      Ich versuche es nochmal.

      Die Tabelle 'einheit' : 'id', 'kuerzel' enthält die Einträge:

      id kuerzel
      1  E
      2  F
      3  G
      4  H
      5  I

      Sowas

        
      foreach (var array("D", "F", "I")) {  
        SELECT  
          kuerzel  
        FROM  
          einheit  
        WHERE kuerzel = var  
      ...  
      }  
      
      

      würde ich gerne so schreiben

        
        SELECT  
          kuerzel  
        FROM  
          einheit  
        WHERE kuerzel enthalten in array("D", "F", "I")  
      ...  
      
      

      um nur eine SQL Abfrage zu benötigen; gibt es sowas?

      -- explizite Joins machen Abfragen meiner
      -- Meinung nach viel leichter lesbar und
      -- trennen wunderbar Join-Bedingungen

      Ich schreibe die JOINS meist erst implizit und baue sind dann in explizite um (um es der DB zu erleichtern). Ziemlich überflüssige Arbeit, hat wahrscheinlich historisch Ursachen :)

      Gruß
      NaN

      1. Hallo,

        SELECT
            kuerzel
          FROM
            einheit
          WHERE kuerzel enthalten in array("D", "F", "I")
        ...

          
        
        > um nur eine SQL Abfrage zu benötigen; gibt es sowas?  
          
        klar, es gibt den IN-Operator :-) Auf die Idee, dass Du diesen suchst, wäre ich wirklich nicht gekommen.  
          
        ~~~sql
          
        SELECT  
            kuerzel  
        FROM  
            einheit  
        WHERE kuerzel [link:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in@title=IN] ('D', 'F', 'I')  
        
        

        Anmerkung: Es ist eine verdammt gute Idee, Zeichenketten in SQL in einfache Anführungszeichen zu setzen. Viele DBMS verstehen nichts anderes.

        Freundliche Grüße

        Vinzenz

        1. um nur eine SQL Abfrage zu benötigen; gibt es sowas?

          klar, es gibt den IN-Operator :-) Auf die Idee, dass Du diesen suchst, wäre ich wirklich nicht gekommen.

          Es ist nicht zu glauben, ich hätte nur nach IN suchen müssen. Manchmal sind die Dinge erschütternd einfach :)

          Anmerkung: Es ist eine verdammt gute Idee, Zeichenketten in SQL in einfache Anführungszeichen zu setzen. Viele DBMS verstehen nichts anderes.

          Danke
          NaN