# MySQL: Abfrage auf 2 Tabellen durch join



## Saskia21 (14. März 2008)

Hallo Leute

Ich versuche eine Abfrage auf 2 Tabellen zumachen.
Ich will 2 unt Werte bekomme - einmal die, die nicht auf die Bed zutreffen und einmal die, die auf die Bed zutreffen.
Glaube das man das mit LEFT JOIN und RIGHT JOIN machen kann...
Hat jemand ein SELECT-Bespiel für mich?


----------



## Saskia21 (14. März 2008)

Ein Beispiel:

Wenn ich diese Abfrage mache:
SELECT * FROM tabelle1 WHERE datum > '2008-02-01 08:00:00'
->bekomme ich z.B. 13 Einträge.
Diese 13 Einträge unterscheide ich durch einen Vergleich mit einer 2. Tabelle
1.
SELECT * FROM tabelle1 
WHERE datum > '2008-02-01 08:00:00' and typ IN
   (SELECT typ  
   FROM tabelle2 
   WHERE tabelle1.typ like tabelle2.typ 
   and (wert like 'E' or wert like 'N'))
GROUP BY typ;
-> da bekomme ich 2 Werte raus
nun will ich die restlichen 11 Werte bekommen, wenn ich es negativ setzte geht es nicht, hab es schon ausprobiert


----------



## shutdown (14. März 2008)

Die logische Negierung müsste an folgender Stelle vorgenommen werden.
Ob das inhaltlich so richtig ist, kann ich dir nicht sagen, weil ich von deinen Tabellen nix weiß.


```
SELECT * FROM tabelle1 
WHERE datum > '2008-02-01 08:00:00' and typ 


NOT


IN
(SELECT typ 
FROM tabelle2 
WHERE tabelle1.typ like tabelle2.typ 
and (wert like 'E' or wert like 'N'))
GROUP BY typ;
```


----------



## Saskia21 (14. März 2008)

HI
Nein so geht es leider nicht, weil der typ ruhig gleich sein kann, sprich in Tabelle2 seien kann oder nicht. nur wenn er gleich ist darf der wert nicht e oder n sein. Aber es gibt ja auch noch die möglichkeit, dass der typ aus tabelle1 nicht in tabelle2 ist... versteht du wie ich das mein


----------



## shutdown (14. März 2008)

1. Nein, ich verstehe nicht genau was du meinst - gib halt mal Beispiele was in den Tabellen steht.
2. Soweit ich dich verstehe, macht dann deine Abfrage überhaupt keinen Sinn.


----------



## Saskia21 (14. März 2008)

in der Tabelle1 stehen verweise auf Dateien, die lokal in einer Ordnerstruktur liegen.
Es gibt 2 Arten von Ordnern in denen die Dateien liegen.
1. Art ist, wenn der typ aus tabelle1 und tabelle2 übereinstimmen und der wert in Tabelle2 e oder n ist.
2. Art, wenn der typ aus Tabelle1 nicht in Tabelle2 steht oder, wenn der Typ aus Tabelle1 in Tabelle2 steht, der wert aber nicht e oder n ist.
Ich hoffe jetzt ist es ein bisschen verständlicher


----------



## shutdown (14. März 2008)

Nein ist es nicht wirklich.

Was gibt es in Tabelle 1 für Spalten und wie sind diese belegt? (2 Beispiele reichen)
Was gibt es in Tabelle 2 für Spalten und wie sind diese belegt? (2 Beispiele reichen)


Ansonsten versuche ich jetzt mal deine verwirrende Beschreibung zu deuten - vielleicht funktionierts ja:


```
SELECT * FROM tabelle1 WHERE datum > '2008-02-01 08:00:00' AND (typ  
 NOT  IN(
      SELECT typ FROM tabelle2
) 

OR (wert LIKE 'E' OR wert LIKE 'N')
)
```

Aber das ist geraten, da ich ja noch nicht mal weiß, aus welcher Tabelle denn überhaupt der Wert stammt! ! !


----------



## Saskia21 (14. März 2008)

Also:

Tabelle1--------------------Tabelle2
Spalte typ:------------     Spalte typ ----------- Spalte wert
A  ----------------------       A------------------------ e
B  ----------------------       F------------------------  n
C  ----------------------       B -----------------------  e
D   ----------------------      D -----------------------  x

(Striche sind nur Platzhalten)
Ablauf
Prüfung 1: Ist A von Tabelle1 in Tabelle2 ->ja
                Hat das A in Tabelle2 den wert e oder n-> ja
                (Ordnertyp 2)
Prüfung 2: Ist B von Tabelle1 in Tabelle2 ->ja
                Hat B in Tabelle2 den wert e oder n -> ja
               (Ordnertyp 2)
Prüfung 3: Ist C von Tabelle1 in Tabelle2 ->nein
               (Ordnertyp 1)
Prüfung 4: Ist D von Tabelle1 in Tabelle2 -> ja
               Hat D von Tabelle2 den wert e oder n -> nein
               (Ordertyp 1)

Vllt ist es ja jetzt verständlich.


----------



## shutdown (14. März 2008)

Weiß zwar nicht, welchen Sinn diese Variante haben soll, aber:


```
select * from tabelle1 where datum > '2008-02-01 08:00:00' 

AND (

typ not in (
   select typ from tabelle2
)

OR

typ not in (
   select typ from tabelle2 where wert in ('E', 'N')
)

)
```


----------

