Dirk: SQL Problem ...

Hallo zusammen,

habe ein kleines SQL-Problem (MySQL 3.23.56), zu dem ich überhaupt keinen sinnvollen Lösungsansatz finde: Ich will aus der unteren Tabelle alle Produkte filtern, die in rot und grün verfügbar sind.

Produkt | Farbe
---------------
 1      | rot
 1      | gelb
 1      | grün
 2      | rot
 3      | blau
...

Mit AND bzw. OR Verknüpfungen komme ich da ja nicht besonders weit ... Hat da irgendjemand eine Idee?

Dank schon mal :-)
Dirk

  1. Hallo

    Mit AND bzw. OR Verknüpfungen komme ich da ja nicht besonders weit ...

    Wiso?
    where Farbe='grün' OR Farbe='rot'

    ergibt alle Produkte, die Grün und rot sind ...
    Nicht?

    Gruß Matrix

    1. Hi,

      ergibt alle Produkte, die Grün und rot sind ...
      Nicht?

      Nein, gibt die Menge der Produkte, die es in grün gibt + die Mege der Produkte, die es in rot gibt.
      Aber man kann sich ja mal verlesen.

      Zu Deiner Frage nochmal:

      Ich denke, das geht so:

      Antwort morgen... Ich muss weg :-)))

      Ciao.

      Aber das mit dem Distinct von seth kann ich mir nicht vorstellen, weil Du ja garkeine 2 Tables hast, oder?

      1. hi Matrix!

        Aber das mit dem Distinct von seth kann ich mir nicht vorstellen, weil Du ja garkeine 2 Tables hast, oder?

        http://www.mysql.de/doc/de/Multiple_tables.html (unten, letztes beispiel)

        die beiden tabellen, bei denen man einen join durchfuehrt, muessen nicht verschieden sein. eine tabelle kann auch einfach mit sich selbst verknuepft werden.

        prost
        seth

  2. hi Dirk!

    wenn du alle produkte extrahieren willst, fuer die gilt, dass sie in beiden farben (rot und gruen) existieren, dann kannst du das z.b. erreichen mit

    select distinct t1.produkt
    from tabelle t1, tabelle t2
    where t1.produkt=t2.produkt
     and t1.farbe="rot"
     and t2.farbe="gruen";

    prost
    seth

  3. Hallo Dirk,

    habe ein kleines SQL-Problem (MySQL 3.23.56), zu dem ich überhaupt keinen sinnvollen Lösungsansatz finde: Ich will aus der unteren Tabelle alle Produkte filtern, die in rot und grün verfügbar sind.

    SELECT DISTINCT Produkt,Farbe FORM tabelle WHERE Farbe='rot' OR Farbe='grün'
    sollte helfen (was es mit DISTINCT auf sich hat, steht in http://www.mysql.de/doc/de/Selecting_columns.html).

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. Hallo,

      SELECT DISTINCT Produkt,Farbe FORM tabelle WHERE Farbe='rot' OR Farbe='grün'

      Diese Abfrage bringt dir jetzt vermutlich immer noch das Ergebnis
      1 | rot
      1 | grün
      2 | rot
      oder so.
      Wenn du stattdessen nur die 1 und die 2 haben willst, dann musst du aus dem DISTINCT noch das ", Farbe" rausnehmen (falls die Datenbank das mitmacht trotz WHERE-Klausel):
      SELECT DISTINCT Produkt FROM tabelle WHERE Farbe='rot' OR Farbe = 'grün'
      oder auch
      SELECT DISTINCT Produkt FROM tabelle WHERE Farbe IN ('rot', 'grün')

      MfG
      Rouven

      --

      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
      1. Hallo Rouven,

        SELECT DISTINCT Produkt,Farbe FORM tabelle WHERE Farbe='rot' OR Farbe='grün'
        Diese Abfrage bringt dir jetzt vermutlich immer noch das Ergebnis
        1 | rot
        1 | grün
        2 | rot
        oder so.

        stimmt, du hast recht - allerdings habe ich in dem Query noch einen Verdreher eingebaut: es muss natürlich FROM statt FORM heißen :-)

        SELECT DISTINCT Produkt FROM tabelle WHERE Farbe='rot' OR Farbe = 'grün'
        SELECT DISTINCT Produkt FROM tabelle WHERE Farbe IN ('rot', 'grün')

        die funktionieren beide (habs getestet :-))

        Grüße aus Nürnberg
        Tobias

        --
        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        1. Hi Tobias,

          ein Problem - zu dem sich unser Fragesteller leider nicht mehr geäußert hat - ist aber immer noch da:
          Wenn er alle Produkte haben will die in rot UND grün verfügbar sind, dann ist natürlich sicher zu stellen, dass auch wirklich beide Farben da sind, d.h. vielleicht sollte man am Ende doch noch mit sich selbst joinen um das sicherzustellen:
          SELECT DISTINCT produkt
          FROM
          tabelle1 as a
          INNER JOIN
          tabelle1 as b
          ON a.produkt=b.produkt
          WHERE a.farbe = 'grün'
            AND b.farbe = 'rot'

          Ich möchte jetzt gerade nicht drüber nachdenken, ob das DISTINCT dann noch einen Sinn macht...

          MfG
          Rouven

          --

          -------------------
          ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
          1. Hi Rouven,

            erst mal vielen Dank!

            Wenn er alle Produkte haben will die in rot UND grün verfügbar sind, dann ist natürlich sicher zu stellen, dass auch wirklich beide Farben da sind, d.h. vielleicht sollte man am Ende doch noch mit sich selbst joinen um das sicherzustellen:

            Die Idee mit dem inner join ist super, so funktioniert es sicherlich auch. Die Angabe von DISTINCT bringt vermutlich nur dann etwas, wenn ein Produkt mehrmals mit der selben Farbe vorkäme, was aber keinen Sinn ergibt.

            Grüße, Dirk

          2. Hallo Rouven,

            Wenn er alle Produkte haben will die in rot UND grün verfügbar sind, dann ist natürlich sicher zu stellen, dass auch wirklich beide Farben da sind,

            stimmt, das schrieb er ja im Ausgangsposting...

            SELECT DISTINCT produkt

            die Zeile muss
            SELECT (a|b).produkt
            lauten - mit DISTINCT bekommst du garkein Ergebnis, und ohne (a|b). einen ambiguous-Fehler - ansonsten Funktioniert der Query.

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|