# Wie kann ich diese Abfrage machen?



## frage (3. Feb 2007)

hallo, ich habe das folgende er modell: link.

ich moechte da alle boote (baat) finden, die einen bestimmten motor haben. also das heisst, ich suche die tabelle motor ab und moechte am ende alle boote haben, die einen solchen motor haben. ich denke mal, dazu benoetige ich die tabellen baat, motor und baatmotor,,,aber ich bekomms nicht recht hin. hier ist, was ich habe:

_
SELECT b.id FROM baat b  
LEFT JOIN baatmotor bm ON (bm.baatid = b.id)
LEFT JOIN motor m ON (m.id = bm.motorid))
WHERE b.modell LIKE '%text%' OR b.produksjonsland LIKE '%text%' OR b.lang_beskrivelse LIKE '%text%' OR b.kort_beskrivelse LIKE '%text%' OR b.ovrige_opplysninger LIKE '%text%' OR b.byggemateriale LIKE '%text%' OR b.baattype LIKE '%text%' OR m.modellbetegnelse LIKE '%text%' OR m.drivstoff LIKE '%text%' OR m.type LIKE '%text%' OR m.motorkunstruksjon LIKE '%text%' OR m.kjolesystem LIKE '%text%' OR m.tenningssystem LIKE '%text%' OR m.drivstoffsystem LIKE '%text%' OR m.giringsforhold LIKE '%text%' OR m.girskift LIKE '%text%' OR m.propellutvalg LIKE '%text%' OR m.startsystem LIKE '%text%' OR m.tilteposisjon LIKE '%text%' OR m.styring LIKE '%text%' OR m.kontraroterende LIKE '%text%' OR m.oljeblanding LIKE '%text%' OR m.std_propp LIKE '%text%' OR m.chokesystem LIKE '%text%' OR m.produsentland LIKE '%text%' OR m.infotext LIKE '%text%' OR m.kort_beskrivelse LIKE '%text%' OR m.lang_beskrivelse LIKE '%text%' ORDER BY b.modell ASC;
_

ist nicht auf deutsch...kann man aber gut lesen. was in den tabellen steht tut ja nix weiter zur sache. aber wie mach ich das wohl?

vielen dank


----------



## SlaterB (3. Feb 2007)

wie wärs mit Formatierung??

und was soll die Anfrage denn nun machen???

da steht select irgendwas WHERE b.modell LIKE '%text%' OR (irgendwas)

d.h. dass du hier unter anderem alle Boote mit einem bestimmten Modell suchst,
auf die Menge der Motoren findet keinerlei Einschränkung statt,
passt gar nicht zu deiner Beschreibung?

und kannst du nicht klein anfangen mit maximal einem Attribut von Boot und einem von Motor?
außerdem mit leichteren Werten statt Variablen?
where b.modell LIKE 'Modell15'?


----------



## frage (3. Feb 2007)

also ich moechte die tabelle motor nach einem begriff durchsuchen. zum beispiel *modell30* oder sowas eben. am ende moechte ich alle ids von den booten erhalten, die eben die gefundenen motoren bestizten. ich hatte mir gedacht, es in mehreren schritten zu machen.

1. erstmal die tabelle motor durchsuchen: _select id from motor m WHERE m.modellbetegnelse LIKE '%30%' OR m.drivstoff LIKE '%30%' OR m.type LIKE '%30%' OR m.motorkunstruksjon LIKE '%30%' OR m.kjolesystem LIKE '%30%' OR m.tenningssystem LIKE '%30%' OR m.drivstoffsystem LIKE '%30%' OR m.giringsforhold LIKE '%30%' OR m.girskift LIKE '%30%' OR m.propellutvalg LIKE '%30%' OR m.startsystem LIKE '%30%' OR m.tilteposisjon LIKE '%30%' OR m.styring LIKE '%30%' OR m.kontraroterende LIKE '%30%' OR m.oljeblanding LIKE '%30%' OR m.std_propp LIKE '%30%' OR m.chokesystem LIKE '%30%' OR m.produsentland LIKE '%30%' OR m.infotext LIKE '%30%' OR m.kort_beskrivelse LIKE '%30%' OR m.lang_beskrivelse LIKE '%30%'_

2. die gefunden ids der motoren in einer liste halten und dan jedes element dieser liste mittels: _SELECT baatid FROM baatmotor
WHERE motorid = 'element der liste'_

3. jedes ergebnis von 2 in eine andre liste packen und am ende alle boote mit den gefunden motoren haben.


sollte doch gehen, oder? 

gruesse


----------



## abollm (3. Feb 2007)

frage hat gesagt.:
			
		

> hallo, ich habe das folgende er modell: link.
> 
> ich moechte da alle boote (baat) finden, die einen bestimmten motor haben. also das heisst, ich suche die tabelle motor ab und moechte am ende alle boote haben, die einen solchen motor haben. ich denke mal, dazu benoetige ich die tabellen baat, motor und baatmotor,,,aber ich bekomms nicht recht hin. hier ist, was ich habe:
> [..]
> vielen dank



Also, so wie ich das ER-Diagramm verstanden habe, muss es wie folgt funktionieren (in dieser Abfrage wird nur die Motor-ID selektiert):

```
SELECT m.id
  FROM motor m,
       baat b,
       baatmotor bm,
 WHERE  bm.motorid = m.id
   AND bm.baatid = b.id;
```


----------



## SlaterB (3. Feb 2007)

klingt doch gut, und was geht nun nicht?
ob das mit den Left Join richtig syntaktet ist kann ich nun nicht sagen,

aber auf jeden Fall ist doch wohl
WHERE m.modellbetegnelse LIKE '%30%' ........
für diesen Thread irrelevant oder?

sage "WHERE m.id in (100,2003,200445);"
und gut, mehr muss man doch über m nicht wissen

so und nun gehts noch um was?
um den Join mit baatmotor?
dann mache erstmal das, aber NUR das, ohne Boot-Tabelle,

ein Join über diese beiden Tabellen, dann dürftest du eine Menge von battmotor-Ids bekommen,
klappt das oder nicht?

wenn diese Ids da sind, dann vergesse das alles komplett und merke dir nur 
"WHERE battmotor.id in (17,18,19,29);"

dann gehts weiter zur Boot-Tabelle, genau der gleiche Schritt nochmal,
klappt der Join oder nicht?

wenn alles geht, dann kann man sich über die Gesamtanfrage nochmal Gedanken machen

was ist nun überhaupt die Frage?.............


----------



## frage (3. Feb 2007)

hi, also nochmal erklaert. ich durchsu che die tabelle motor nach einem begriff. irgendeine zeichenfolge. dann moechte ich eben alle boote finden, die die gefundenen motoren haben. ich weiss eben nicht, wie ich DAS machen soll. ich wuerde es gern in einerm sql satement machen und nicht mit zich listen. es muss ja nicht mit join sein oder so. hauptsache, es geht. auf jeden fall muss doch da der suchbegriff mit rein...deshalb geht die eine variante von abollm nicht.

ne idee, oder reden wir aneinander vorbei?

danke


----------



## SlaterB (3. Feb 2007)

um WARUM zum tausendesten Male nicht?

nach 5 Posts willst du jetzt sagen dass du gar nicht weißt wie die Anfrage grundsätzlich geht?
was spricht gegen einen JOIN?
mit einem Join geht es! was soll man denn da sonst drauf antworten?
du hattest doch ganz am Anfang schon vorgeschlagen Join,
deshalb habe ich bisher auch nicht groß drüber geredet sondern nun schon x-mal gefragt, was deine Frage ist,

also Frage nach Join.., immerhin mal eine klitzekleine Info..,
gibt nur eine Antwort: Join geht..

die klassische Variante ist die von abollm,
da kannst du nun gerne weiter sagen 'geht nicht', gut dann ist die Diskussion eben zu Ende 
geht aber,

Left Join kenne ich nicht so, geht bestimmt auch,

wenn dir Joins nicht klar sind, dann übe damit erstmal auf einfachere Weise,
schaue in die Tabellen rein, 
suche einen Eintrag Boot mit Id x, Motor y, Bottmotor a für x +y

dann 

```
SELECT m.id
  FROM motor m,
       baat b,
       baatmotor bm,
WHERE  bm.motorid = m.id
   AND bm.baatid = b.id and b.id = x
```
schon kommt y raus,
das einfachste in der Welt

bzw. erstmal zwischen 2 Tabellen probieren, nicht gleich über 3..,
wie im vorherigen Post von mir beschrieben


----------



## KL (4. Feb 2007)

Hi frage,

Du bist ja schon auf dem richtigen Weg (gewesen), nur die Baat-Tabelle brauchst Du ja nicht wirklich abzufragen, weil den Wert bekommst Du ja schon aus Baatmotor?
Vermutlich ist nur eine schließende Klammer zuviel:




> SELECT b.id FROM baat b
> LEFT JOIN baatmotor bm ON (bm.baatid = b.id)
> LEFT JOIN motor m ON (m.id = bm.motorid))


*


mfg
KL*


----------

