# Wie koennte die SQL Query aussehen?



## EOB (24. Nov 2006)

hallo, ich habe folgendes ER modell: link

ist zwar auf norwegisch, aber man kann sich das ja ein bisschen denken . ich moechte jetzt daraus zum beispiel alle kategorien (kategori) holen, die als farbe (farge) gruen haben und einen produktpreis (produkt) zwischen 300 und 500 haben. wie koennte ich das wohl anstellen?

kategorie koennte zum beispiel 'schmuck' sein und farbe eben eine farbe, zum beispiel 'gruen'. bei produkt gehts mir erstmal nur um das attribut pris (preis). also als konkretes beispiel:

suche jeden gruenen schmuck, der zwischen 300 und 500 euro kostet. 

wie wuerde das gehen? das sind doch sicher select in select und so?

danke


----------



## AlArenal (24. Nov 2006)

quick & dirty:


```
SELECT 
	p.id, p.produktnavn, k.knavn, f.fargenavn 
FROM 
	produkt p, produktkategori pk, kategori k, farge f, produktfarge pf
WHERE
	p.id = pf.produktid AND
	pf.fargeid = [f.id der grünen Farbe] AND
	p.merkeid = pk.produktid AND
	pk.kategoriid = [k.id von Schmuck] AND
	p.pris >= 300 AND
	p.pris <= 500 AND
```


----------



## EOB (24. Nov 2006)

hi, vielen dank. sieht ja schonmal gut aus. allerdings bringt er mir immer ein empty set. also entweder passt das in meiner db nicht, oder es ist ein fehler im obigen sql code....ne idee?

danke


----------



## AlArenal (24. Nov 2006)

```
SELECT
   p.id, p.produktnavn, k.knavn, f.fargenavn
FROM
   produkt p, produktkategori pk, kategori k, farge f, produktfarge pf
WHERE
   pf.produktid = p.id AND
   pf.fargeid = [f.id der grünen Farbe] AND
   pk.produktid = p.id AND
   pk.kategoriid = [k.id von Schmuck] AND
   p.pris >= 300 AND
   p.pris <= 500 AND
```


----------



## EOB (24. Nov 2006)

hm...geht immer noch nicht so recht. er bringt mir zwar resultate, aber es sind zu viele....nicht nur gruen zum beispiel. ich habs schon probiert...hm...noch ne idee?

danke


----------



## The_S (24. Nov 2006)

```
SELECT, knavn, bildesti FROM kategori WHERE id IN
(SELECT kategoriid FROM subkategori WHERE id IN
(SELECT subkategoriid FROM produkt WHERE pris BETWEEN 300 AND 500 AND id IN
(SELECT produktid FROM produktfarge WHERE id IN
(SELECT id FROM farge WHERE fargenavn='gruen'))))
```

Spontan so, ohne größer drüber nachzudenken  .


----------



## AlArenal (24. Nov 2006)

ist ein wenig doof, wenn man es selbst nicht testen kann und natürlich liegt mein "Practical SQL" auf der Arbeit und ich hocke daheim (Lichtmaschine am Eimer)....


----------



## AlArenal (24. Nov 2006)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> ```
> SELECT, knavn, bildesti FROM kategori WHERE id IN
> (SELECT kategoriid FROM subkategori WHERE id IN
> (SELECT subkategoriid FROM produkt WHERE pris BETWEEN 300 AND 500 AND id IN
> ...



Und in der Hoffnung, dass er ne DB hat die Subselects unterstützt.
Da kannste aber mit EXPLAIN noch gaaaaanz lange optimieren.


----------



## EOB (24. Nov 2006)

geht auch nicht...hm....misst. aber gehen sollte es doch, oder?

gruesse

ps: ich probiere auch rum!


----------



## The_S (24. Nov 2006)

Evtl. hilft es wenn du sagst was nicht geht  . Aber da geb ich AlArenal recht, es ist echt blöd wenn man das nicht selber testen kann ...


----------



## EOB (24. Nov 2006)

es kommt Empty Set zurueck...also findet er nix...muesste aber, da genuegend datensaetze drin sind.

gruesse


----------



## yajp (24. Nov 2006)

hmm probier mal das, ich bin davon ausgegangen dass naven = name ;-)

SELECT id, produktnavn FROM produkt WHERE
produkt.id = produktkategoriid AND
produktkategoriid.kategoriid = kategori.id AND
kategori.knavn = 'Schmuck' AND
produkt.id = produktfarge.produktid AND
produktfarge.fargeid = farge.id AND
farge.fargenaven = 'gruen' AND
produkt.pris BETWEEN 300 AND 500


grüsse


----------



## EOB (24. Nov 2006)

hi, habs jetzt so geloest und scheint zu klappen:


```
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';
```

gruesse und dank an euch!!


----------



## EOB (27. Nov 2006)

moinsen, so, nu hab ich das problem, dass ich nicht weiss, wie ich bei dieser query sagen kann, dass ich ALLE kategorien will, also nicht nur zb. schmuck, der gruen ist und zwischen 300 nud 500 kostet. oder alles was gruen ist, oder alles was schmuck ist und zwischen 300 und 500 kostet. jemand ne idee?

danke


----------

