# Zwei Bedingungen in Left Join Query über vier Tabellen



## gaengsterbruth (6. März 2007)

Hallo Zusammen!

Hab da ein etwas schwieriger zu lösendes SQLQuery.

Habe vier Tabellen:
- user
- anlagen_user
- anlagen
- anlagen_firma

Es sollen mir nur die User zur aktuellen Anlage angezeigt werden, welche die ID_Firma 2 besitzen.

```
SELECT User.NAME AS UserNAME
FROM User, anlagen_user, anlagen, anlagen_firma
WHERE User.ID_USER = anlagen_user.ID_USER
AND anlagen_user.ID_ANLAGEN = anlagen.ID_ANLAGEN
AND anlagen.ID_ANLAGEN = anlagen_firma.ID_ANLAGEN
AND anlagen_user.ID_ANLAGEN = '85'
AND (
 anlagen_firma.ID_FIRMA LIKE '%2%'
 )
```
Wie muss ich das Query Umschreiben, damit nur diese User erscheinen ?
(mit dem oben dargestellten Query erhalte ich viel zu viele Datensätze)
Kann ich die zwei Bedingungen nicht so stellen ? (Muss ich das mit Subquery oder so lösen ? )

Danke für eure Antworten


----------



## mart (6. März 2007)

Hi,

was heißt zuviele Datensätze? Kommen doppelte Usernamen, oder kommen Usernamen, die da eigentlich nicht hingehören?


----------



## michaelwengert (6. März 2007)

Wenn nur manche Usernamen doppelt oder mehrfach vorkommen kannst du ja nach dem Usernamen gruppieren. (mit "GROUP BY")


----------



## gaengsterbruth (6. März 2007)

Nein es kommen nicht doppelte Datensätze vor, sondern Datensätze die da nicht hingehören.
Das heisst auch Usernamen die nicht die Firma 2 besitzen.
Daraus lässt sich aus meiner Sicht schliessen, dass nur die erste Bedigung behandelt wird,
da würde auch die Anzahl zurück erhaltener Datensätze stimmen.


----------



## mart (6. März 2007)

Hmm,

irgendwie hab ich noch Probleme Deine Tabellenstruktur und deren Bedeutung zu verstehen. Vielleicht hilft ja das hier:


```
select
	u.name as username
from 
	user u,
	anlagen_user au
where
	u.id_user = au.id_user and
	au.id_anlagen= '85' and
	au.id_anlagen in (select id_anlagen from anlagen_firma where id_firma like '%2%')
```

Wenn nicht poste doch mal Deine Tabellenstruktur.

//Edit:
Ich sehe gerade, das sql oben ist käse, da wird 2 mal auf au.id_anlagen gefiltert. Wie gesagt, wenn Du nicht weiterkommst, mal kurz die Tabellen posten...


----------



## gaengsterbruth (6. März 2007)

Dankeschön Mart  
Glaube das ist schon mal ein Schritt in die richtige Richtung.
Hab nur immer noch das Problem, dass ich egal ob ich ....

... die IN Klausel
... die AND au.id_anlagen= '85' Klausel  
... oder beide Klauseln 

gleichzeitig am Laufen habe, die gleiche Anzahl Datensätze als Antwort bekomme.
Kann ja nicht sein oder ?

Bin mich gerade am Fragen, ob meine Datenbank Daten nicht richtig abgefüllt sind.
Habe im Anhang noch meine Tabellenstruktur angehängt, denke die sollte richtig sein.

Gruess

Ruth


----------



## mart (6. März 2007)

Hi,

also ich hab mir das nochmal hergeleitet und komme wieder auf die gleiche Abfrage wie vorhin. Ich hab aber mal geändert, dass Du auf id_firma = 2 filterst. Könnte das das Problem sein? Denn vorher hieß es ja "like '%2%'". Damit erwischst Du alle Datensätze, die irgendwie ne "2" in id_firma haben.


```
select
	u.name as username
from
	user u,
	anlagen_user au,
where
	u.id_user = au.id_user and
	au.id_anlagen in (select af.id_anlagen from anlagenfirma af where af.id_firma = 2)
```

Ansonsten fällt mir nix mehr ein, sorry


----------



## gaengsterbruth (6. März 2007)

Neee das mit den % ist mir bewusst. Spielt aber momentan noch keine Rolle. Hab das aber auch schon geändert in meinem Query.
Naja Danke trotzdem ....


----------



## gaengsterbruth (7. März 2007)

Sorry Mart das Query ist Korrekt. Habe gemerkt, dass mir ein Überlegungsfehler passiert ist. Brauche nämlich noch eine weitere Bedingung, über die Tabelle firma_user die ich vergessen habe.

Danke für Eure Hilfe

Mein neues Query:


```
SELECT u.name AS username
FROM user u, anlagen_user au
WHERE u.id_user = au.id_user
AND au.id_anlagen = '72'
AND au.id_anlagen
IN (

SELECT id_anlagen
FROM anlagen_firma af
WHERE af.id_firma = '2'
)
AND au.ID_USER
IN (

SELECT ID_User
FROM firma_user fu
WHERE fu.id_firma = '2'
)
```


----------

