# SQL-Abfrage über 1:n Relation



## ladego (17. März 2010)

Ahoi,
bin scheinbar ziemlich daneben oder warum klappt seit stunden eine relativ einfache abfrage mit 2 tabellen nicht?
folgendes ist gegeben:
1. tabelle '3dcontent' mit uid, pid,3dimage,webname...
2. tabelle 'images' mit uid,pid...
die tabelle 'images' ist über eine n:1 Relation mit '3dcontent' verknüpft, sodass in tabelle '3dcontent' ein feld mit dem Namen '3dimage' die uids aus 'images' enthält zb:
3dcontent.3dimage = 3,4,5,6,7,8,9,10,11,12
jetzt probiere ich immer mit dem gleichen falschen ergebnis die uids aus 'images' abzufragen, die zu einem 'webname' aus '3dcontent' gehören zb:
SELECT c.3dimage, c.webname, i.uid
FROM 3dcontent AS c
INNER JOIN images AS i ON i.uid
AND c.webname = 'wasser'

ergebnis:

3dimage   	                   webname    uid
3,4,5,6,7,8,9,10,11,12 	wasser 	3
3,4,5,6,7,8,9,10,11,12 	wasser 	2
3,4,5,6,7,8,9,10,11,12 	wasser 	4
3,4,5,6,7,8,9,10,11,12 	wasser 	5
3,4,5,6,7,8,9,10,11,12 	wasser 	6
3,4,5,6,7,8,9,10,11,12 	wasser 	7
3,4,5,6,7,8,9,10,11,12 	wasser 	8
3,4,5,6,7,8,9,10,11,12 	wasser 	9
3,4,5,6,7,8,9,10,11,12 	wasser 	10
3,4,5,6,7,8,9,10,11,12 	wasser 	11
3,4,5,6,7,8,9,10,11,12 	wasser 	12

problem:
es sollte eigentlich nur 10 zeilen auswerfen, denn zeile 2 mit uid=2 gehört nicht zum 'webname' = wasser
habs auch schon mit anderen sql statements versucht und bekomme den gleichen fehler.
Irgendwie hab ichs wohl nicht ganz begriffen oder was ist da los?


```
SELECT DISTINCT c.3dimage, c.webname, i.uid
FROM tx_gwkoi3d_3dcontent AS c
INNER JOIN tx_gwkoi3d_images AS i ON i.uid
AND c.webname = 'wasser'
```


----------



## Alex F. (18. März 2010)

```
SELECT c.3dimage, c.webname, i.uid
FROM 3dcontent AS c
INNER JOIN images AS i ON i.uid = c.Uid
AND c.webname = 'wasser'
```

Deine Join bedingung war nicht ganz ausformuliert.
Grüsse bb


----------



## ladoga (18. März 2010)

ja, danke erstmal, aber das hatte ich auch schon mal ausprobiert.
Nur wird dann lediglich ein Ergebnis ausgeworfen (an der Stelle wo die uid gleich ist)
und sieht dann so aus:

3dimage  	 webname  	 uid
3,4,5,6,7,8,9,10,11,12 	wasser 	2

ich möchte allerdings alle datensätze haben, deren uid in 3dimage steht, also vom ergebnis:
3dimage   	  webname   	  uid
3,4,5,6,7,8,9,10,11,12 	wasser 	3
3,4,5,6,7,8,9,10,11,12 	wasser 	4
3,4,5,6,7,8,9,10,11,12 	wasser 	5
3,4,5,6,7,8,9,10,11,12 	wasser 	6
3,4,5,6,7,8,9,10,11,12 	wasser 	7
3,4,5,6,7,8,9,10,11,12 	wasser 	8
3,4,5,6,7,8,9,10,11,12 	wasser 	9
3,4,5,6,7,8,9,10,11,12 	wasser 	10
3,4,5,6,7,8,9,10,11,12 	wasser 	11
3,4,5,6,7,8,9,10,11,12 	wasser 	12

Habs auch schon mit IN über eine Unterabfrage versucht, aber irgendwas klappt da immer nicht

(genauer gesagt - ich möchte eigentlich noch andere Felder über die Abfrage rausziehen - hier gehts nur um das prinzip)


----------



## Yaslaw (18. März 2010)

seh ich das Richtig? Du hast dmehrere ids aus `images` in einem Feld in `3dcontent` mit Komma getrennt gespeichert?
Ist nicht gerade geschickt. du solltest eine weitere Tabelle erstellen it den Beziehungen drin.

Ansonsten musst du für jede Beziehungen den String nach übereinstimmungen durchsuchen.


----------



## ladoga (18. März 2010)

ja - daran liegts wohl - allerdings habe ich die tabellen automatisch über den extension kickstarter von typo3 erstellen lassen und der macht das bei Angabe einer 1:n Relation wohl so. Kann es sein das das damit zu tun hat, das mysql 1:n Relationen intern nicht richtig unterstützt? (Ich meine mal sowas irgendwo gelesen zu haben - aber maybe i'm wrong)
Dann müsste ich also das Grundgerüst dieser Extension wieder komplett über den Haufen werfen,

oder gibts vielleicht doch noch eine simple Zwischenlösung für die Abfrage nach dem Motto:

gib mir aus einem Feld mit kommagetrennten INT Werten (3,4,...,12) nach referenzieren über den SELECT nacheinander die dementsprechenden uids aus einer anderen Tabelle aus ?
(ich habe ehrlich gesagt nicht damit gerechnet, das das so kompliziert sein könnte und - wie schon oben geschrieben - bin nach stundenlangem rumdoktern erstmal anders belehrt worden)


----------



## Yaslaw (18. März 2010)

MySQL kann 1:1, 1:n und n:n richtig handeln. Aber was du hast ist eine n:n als 1:n abgebildet. Sieht nach einem Problem deines typo3 kickstarters zu sein (hab keien Ahnung von typo3)

Es gibt schon Lösungen die du brauchen kannst, sauber sind sei aber nicht.

FIND_IN_SET() könnte dir da weiterhelfenn (ich geh davon aus, du hast MySQL)


```
SELECT c.3dimage, c.webname, i.uid
FROM 3dcontent AS c
INNER JOIN images AS i ON FIND_IN_SET(i.uid, c.3dimage)
AND c.webname = 'wasser'
```


----------



## ladoga (18. März 2010)

super!
genau sowas hab ich gesucht - zumindest lässt sich die Abfrage so realisieren.
(Bin mir allerdings tatsächlich über das DB Design jetzt ziemlich im unklaren - muss wohl nochmal überarbeitet werden)

jedenfalls vielen Dank für die schnelle Unterstützung !

gruss - gert


----------

