SQL-Statement
Flo
- datenbank
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
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
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=3Also 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
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?
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
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
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
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 !!!!
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 ;-)
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!
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