# Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so)



## EOB (4. Dez 2006)

hi, also ich komme der sache naeher. ich habe jetzt diese query:

_
SELECT p.produktnavn, k.knavn, p.beskrivelse 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 p.pris LIKE '%foo%' OR p.beskrivelse LIKE '%foo%' OR f.fargenavn LIKE '%foo%' ORDER BY p.produktnavn ASC;
_

das funzt soweit...denk ich zumindest. habs mit junit getestet und es macht das was ich moechte. jetzt moechte ich allerdings auch noch die tabelle place, brand und dealer durchsuchen. wie muesste ich das obige anpassen, damit er mir auch diese durchsucht und zwar nur, wenn es sich um ein produkt handelt? hier nochmals die skizze der datenbank .

vielen dank


----------



## Yzebär (4. Dez 2006)

Du hast doch eigentlich schon alles, was du brauchst. Sieh dir doch mal dein Statement genau an. Wenn du Werte einer Tabelle haben willst, machst du ein select from <Tabelle>, wenn du zusätzlich Werte einer verknüpften Tabelle haben willst machst du zusätzlich ein join <AndereTabelle> on <Verknüpfung>. Die Verknüpfung besteht meistens aus einer ID, also Tabelle.AndereTabelleID = AndereTabelle.ID. Wenn du Verknüpfungen über mehrere Tabellen hinweg hast, kommt zu jeder Verknüpfung ein join <WeitereTabelle> on <WeitereVerknüpfung> hinzu. Ich schreibe dir mal dein bisheriges Statement etwas um und füge die Verknüpfung zur Tabelle brand hinzu.

```
SELECT p.produktnavn, k.knavn, p.beskrivelse, br.brandname
FROM produkt p 
JOIN produktkategori pk ON p.id=pk.produktid 
JOIN kategori k ON pk.kategoriid=k.id 
JOIN produktfarge pf ON p.id=pf.produktid
JOIN farge f ON pf.fargeid=f.id
JOIN brand br ON p.brandid = br.id
WHERE p.pris LIKE '%foo%' OR p.beskrivelse LIKE '%foo%' OR f.fargenavn LIKE '%foo%' 
ORDER BY p.produktnavn ASC;
```

Dir Reihenfolge der JOINs ist egal und Ausgangspunkt ist immer die Tabelle nach dem FROM. Tabellen mit mehreren Verknüpfungen müssen nicht für jede Verknüpfung einzeln in einen JOIN gepackt werden, es reicht, wenn jede benötigte Tabelle einmal in einem JOIN steht. So, nun probiere dein Glück mit dealer und place...

Mit welchem Editor bzw. Tool hast du eigentlich das Schema erstellt, das könnte ich vielleicht auch gebrauchen?


----------



## EOB (5. Dez 2006)

besten dank. allerdings weiss ich nicht, wie ich das mit der tabelle place machen sollte, da die ja nicht so direkt in produkt vorkommt...oder seh ichs nur wieder nicht  :roll: . das schema hab ich mit umbrello gemacht, welches unter linux in den sources drinne ist. weiss nicht, obs auch ne windows version gibt. waer cool, wenn du mir das mit place noch sagen koenntest 

vielen dank erstmal!!

der link zu umbrello


----------



## Yzebär (5. Dez 2006)

Bei der Tabelle place ist es so, daß sie ja indirekt mit product verknüpft ist, d.h. du mußt jede Tabelle, die auf dem Weg von product zu place liegt "joinen". Wir machen das mal eben gemeinsam Schritt für Schritt...  :wink: 
Die erste Verknüpfung auf dem Weg zu place ist dealerproduct, verknüpft über productid.

```
SELECT *
FROM product pr
JOIN dealerproduct dpr ON pr.id = dpr.productid
```
Die nächste Verknüpfung ist von dealerproduct zu dealer...

```
SELECT *
FROM product pr
JOIN dealerproduct dpr ON pr.id = dpr.productid
JOIN dealer d ON dpr.dealerid = d.id
```
Vom dealer kommen wir zum dealerplace...

```
SELECT *
FROM product pr
JOIN dealerproduct dpr ON pr.id = dpr.productid
JOIN dealer d ON dpr.dealerid = d.id
JOIN dealerplace dpl ON d.id = dpl.dealerid
```
Mit einem etwas anderen JOIN kann man auch den dealer überspringen...

```
JOIN dealerplace dpl ON dpr.dealerid = dpl.dealerid
```
Zuletzt müssen wir vom dealerplace zum place... aber den JOIN bekommste jetzt allein hin oder?!


----------



## EOB (6. Dez 2006)

danke dir ....ich denk schon. 

gruesse

ps: haste umbrella ma getestet?


----------

