Flo: SQL-Statement

Hallo zusammen!

komisches Problem:

Tabelle1 (Artikel_NR;Beschreibung;Preis)
Tabelle2 (KategorieID;Kategorie)
Tabelle3 (Artikel_NR;KategorieID)

Wie um alles in der Welt schaffe ich es ein Produkt zu suchen, das in 3 bestimmten Kategorien steckt (und zwar in allen dreien).

Ich schaffe hier nur ein

SELECT Artikel_NR, Beschreibung
FROM Tabelle1, Tabelle2, Tabelle3
WHERE Tabelle1.Artikel_NR=Tabelle3.Artikel_NR
AND KategorieID=1
OR KategorieID=2
Or KategorieID=3

dies gibt aber alle Produkte von Kategorie 1 2 und 3 aus, also auch welche, die nur in Kategorie1 stehen und nicht nur die, welche in allen gleichzeitig sind.

Bitte helft mir, ich weiß echt nicht weiterm, und das muß bis 16:00 fertig sein !!!

Gruß,
Flo

  1. moin,

    INNER JOIN Ist dein Freund,

    SELECT Artikel_NR, Beschreibung
    FROM Tabelle1, Tabelle2, Tabelle3
    WHERE Tabelle1.Artikel_NR=Tabelle3.Artikel_NR
    AND KategorieID=1
    OR KategorieID=2
    Or KategorieID=3

    Also wahrscheinlich sowas:

    SELECT Artikel_NR, Beschreibung FROM Tabelle1 AS t1
    INNER JOIN Tabelle3 AS t3 ON t1.Artikel_NR=t3.Artikel_NR INNER JOIN
    Tabelle2 AS t2 ON t3.KategorieID=t2.KategorieID WHERE
    KategorieID=1 OR KategorieID=2 Or KategorieID=3

    1. moin,

      INNER JOIN Ist dein Freund,

      SELECT Artikel_NR, Beschreibung
      FROM Tabelle1, Tabelle2, Tabelle3
      WHERE Tabelle1.Artikel_NR=Tabelle3.Artikel_NR
      AND KategorieID=1
      OR KategorieID=2
      Or KategorieID=3

      Also wahrscheinlich sowas:

      SELECT Artikel_NR, Beschreibung FROM Tabelle1 AS t1
      INNER JOIN Tabelle3 AS t3 ON t1.Artikel_NR=t3.Artikel_NR INNER JOIN
      Tabelle2 AS t2 ON t3.KategorieID=t2.KategorieID WHERE
      KategorieID=1 OR KategorieID=2 Or KategorieID=3

      OK - inner join klingt sehr professionell...aber wieso "OR" ?
      Ich will doch eiegtnlich ein "AND". Ich möchte ja, das Produkt XY in Kategorie A, B UND C ist.

      ...geht das auch mit dem Inner Join ?

      Im Moment gibt's nämlich glaube ich dasselbe wie in meinem primitiv-konstrukt da oben.

      Gruß,
      Flo

      1. moin,

        OK - inner join klingt sehr professionell...aber wieso "OR" ?
        Ich will doch eiegtnlich ein "AND". Ich möchte ja, das Produkt XY in Kategorie A, B UND C ist.

        Ok dann hab ich deine DB-Struktur wohl nicht richtig geblickt.

        Wie sieht denn deine Tabelle3 genau aus? Gibt es noch mehr als drei Kategorien?

        1. moin,

          OK - inner join klingt sehr professionell...aber wieso "OR" ?
          Ich will doch eiegtnlich ein "AND". Ich möchte ja, das Produkt XY in Kategorie A, B UND C ist.

          Ok dann hab ich deine DB-Struktur wohl nicht richtig geblickt.

          Wie sieht denn deine Tabelle3 genau aus? Gibt es noch mehr als drei Kategorien?

          Artikel
          -----
          Artikel_ID
          Beschreibung

          Kategorien
          -----
          KategorieID
          Kategorie

          Artikel_Kategorie
          ------
          Artikel_ID
          KategorieID

          Es gibt 44 Kategorien und 4900 Artikel

          Deswegen ist diese Sortierung so essentiell!

          Vielen Dank,
          Flo

          1. moin,

            Tabelle2 brauchst du für das ganze nicht. Hab jetzt auf die Schnelle aber nur "eine von hinten durch die Brust ins Auge" - Version hinbekommen

            SELECT t1.ArtNr, t1.Beschr , sum(if(t3.KatNr=1,1,if(t3.KatNr=2,1,if(t3.KatNr=3,1,0)))) AS test FROM tabelle1 as t1 INNER JOIN tabelle3 as t3 ON t1.ArtNr=t3.ArtNr Group by t3.ArtNr Having test>0

            ArtNr (Artikelnr), Beschr(iftung), KatNr (KategorieNr) musst du an deine DB-Namen anpassen

            1. Natürlich

              SELECT t1.ArtNr, t1.Beschr , sum(if(t3.KatNr=1,1,if(t3.KatNr=2,1,if(t3.KatNr=3,1,0)))) AS test FROM tabelle1 as t1 INNER JOIN tabelle3 as t3 ON t1.ArtNr=t3.ArtNr Group by t3.ArtNr Having test=3

              sorry

              1. Natürlich

                SELECT t1.ArtNr, t1.Beschr , sum(if(t3.KatNr=1,1,if(t3.KatNr=2,1,if(t3.KatNr=3,1,0)))) AS test FROM tabelle1 as t1 INNER JOIN tabelle3 as t3 ON t1.ArtNr=t3.ArtNr Group by t3.ArtNr Having test=3

                sorry

                Ja, genial - das funktioniert !!!!

                Das war echt Lebensrettung kurz vor dem Wochenende!!!

                *puh*

                Ich wusste gar nicht, das sql so komplex sein kann !

                Vielen Dank !!!!

                1. nochmal moin.

                  Ja, genial - das funktioniert !!!!

                  Das war echt Lebensrettung kurz vor dem Wochenende!!!

                  Dass es funktioniert ist schön, allerdings könnte die Performance gering sein. Ausserdem musst du bachten, dass in dieser Konstruktion folgendes Problem auftaucht, wenn du redundante Daten hast:
                  Tabelle 3
                  ArtNr  KatNr
                  1       1
                  1       1
                  1       1

                  2       1
                  2       2
                  2       3
                  2       4

                  Dann "findet" das Statement sowohl ArtNr 1 als auch 2,  obwohl nur 2 gefunden werden sollte. Falls sowas auftreten kann, musst du dir eine komplexere Aggregation überlegen.

                  Ich wusste gar nicht, das sql so komplex sein kann !

                  man lernt halt immer was dazu ;-)

                  1. Dass es funktioniert ist schön, allerdings könnte die Performance
                    gering sein.

                    Ja, die ist ziemlich in den keller gegangen. der MySQL-prozess hat hier gerade fast die gesamte Kiste in beschlag genommen.

                    ...du verstehst nicht zufälligerweise etwas von Linux und clustern.
                    Die Kiste läuft auf einem 600er Celeron und ich habe noch mal ein ähnliches Modell daneben stehen, aber leider keine Ahnung wie man die beiden clustert!
                    Ich weiß nur, das so etwas unter Linux möglich ist!

                    »»Ausserdem musst du bachten, dass in dieser Konstruktion folgendes
                    »»Problem auftaucht, wenn du redundante Daten hast:

                    davor bin ich zum Glück sicher - Redundanzen leigen derzeit nicht vor, und können über die verwaltungsskripte auch nicht entstehen.

                    Aber danke für die Warnung!

                    Schönes Wochenende!

                    1. Hallo Flo

                      Dass es funktioniert ist schön, allerdings könnte die Performance
                      gering sein.

                      Ja, die ist ziemlich in den keller gegangen. der MySQL-prozess hat hier gerade fast die gesamte Kiste in beschlag genommen.

                      glaube ich gern :-). Versuche es mal damit:

                      SELECT
                       artikel.id, artikel.beschreibung, artikel.preis
                      FROM
                       artikel,
                       artikel_kategorie a1,
                       artikel_kategorie a2,
                       artikel_kategorie a3
                      WHERE
                           artikel.id = a1.artikel_id AND a1.kategorie_id = 1
                       AND artikel.id = a2.artikel_id AND a2.kategorie_id = 2
                       AND artikel.id = a3.artikel_id AND a3.kategorie_id = 3

                      Also für jede Kategorie deine Zuordnungstabelle einmal einbinden und entsprechend vergleichen.

                      Viele Grüße

                      Antje