# JOIN und *



## EOB (27. Nov 2006)

hi, wenn ich diese quey habe:

*
SELECT p.produktnavn, k.knavn FROM produkt p JOIN (produktkategori pk, kategori k) ON (p.id=pk.produktid AND pk.kategoriid=k.id) JOIN (produktfarge pf, farge f) ON (p.id=pf.produktid AND pf.fargeid=f.id) where k.id = '1164113247767' and p.pris between 0 and 5000 and f.id = '1164113248104';*

wie kann ich diese umbauen, so dass er mir zb alle kategorien raussucht, die gruen sind und 300-500 kosten? oder alles, was blau ist und so weiter? das er modell, welches zugrunde liegt, koennt ihr hier finden: http://jicoma.com/forum/screenshot.png

ich hab keine ahnung. momentan ist es eben so, dass jeder der 3 werte (kategorie, farbe, preis) da sein muss. ich moechte aber, wenn einer der 3 oder mehrere nicht angegeben sind, ALLES finden. mal ein paar beispiele:

_
kategorie: schmuck
farbe: gruen
preis: 300-500 --> finde gruenen schmuck im preisrange 300-500


kategorie: sachen
farbe:
preis: 300-500 ..> finde alle sachen, egal welche farbe im preisrange 300-500


kategorie:
farbe:
preis: 300-500 --> finde allea, egal welche kategorie und welche farbe was zwischen 300 und 500 kostet
_
und so weiter eben...wie stell ich das wohl an?

gruesse und vielen vielen dank


----------



## AlArenal (27. Nov 2006)

Hast du so rein gar keine Peilung von SQL? Bücher? Arbeitskollegen?


----------



## EOB (27. Nov 2006)

nicht wirklich ... nein   .


----------



## robertpic71 (27. Nov 2006)

Ich bin mir noch nicht sicher, ob ich dein Problem richtig "geschnallt" habe.

Variante A) 
Willst du alle Möglichkeiten mit* einem * Select erfschlagen? Der Selectteil kann ja gleich bleiben, aber es macht die Sache einfacher, wenn man nicht abgefragte Werte einfach aus der Where-Bedingung weglassen kann.

Wenn die Anforderungen sehr unterschiedlich sind, sprich der User viel einstellen kann, verwende ich lieber ein dynamisch zusammengestelltes SQL.

In deinem Fall würde aus dem SQL:

SELECT p.produktnavn, k.knavn FROM produkt p JOIN (produktkategori pk, kategori k) ON (p.id=pk.produktid AND pk.kategoriid=k.id) JOIN (produktfarge pf, farge f) ON (p.id=pf.produktid AND pf.fargeid=f.id) where k.id = '1164113247767' and p.pris between 0 and 5000 *and f.id = '1164113248104'*;

ein
SELECT p.produktnavn, k.knavn FROM produkt p JOIN (produktkategori pk, kategori k) ON (p.id=pk.produktid AND pk.kategoriid=k.id) JOIN (produktfarge pf, farge f) ON (p.id=pf.produktid AND pf.fargeid=f.id) where k.id = '1164113247767' and p.pris between 0 and 5000;

wenn die Farbe nicht relevant ist.

Variante B)
Du hast nicht immer einen gültigen Join. Also z.B. könnte es Produkte ohne Farbcode geben. Mit dem hier geposteten (INNER) JOIN werden solche Sätze nicht geliefert.


----------

