# mysql: Select über zwei Tabellen



## coyu (9. November 2004)

Hallo Leute,

folgende Tabellen:
Tabelle stammdaten: Kundennr | Name | Email
Tabelle zahldaten: Kundennr | Bezahlstatus
Primärschlüssel ist jeweils die Kundennr!

Ich möchte jetzt als Ergebnis eine Liste mit den Mailadressen von den Kunden haben, die bezahlt haben. Also wo Bezahlstatus = 'bezahlt' ist.

Aber ich kriege das nicht hin...

Wie sieht die SELECT-Anfrage dafür aus?

Vielen vielen Dank im voraus!

Coyu


----------



## mobs (9. November 2004)

Muesst so aussehen.


```
SELECT Email FROM stammdaten INNER JOIN zahldaten ON stammdaten.Kundennr = zahldaten.Kundennr WHERE Bezahlstatus = "bezahlt"
```


----------



## andreassin (10. November 2004)

Die Kundennummer darf aber nur PrimaryKey in der Stammdatentabelle sein.
In der Tabelle Zahldaten sollte die Kundennummer Fremdschlüssel sein.
Wenn du Ihn brauchst solltest du für Zahldaten einen extra Primary anlegen.


----------



## redlama (10. November 2004)

Versuch's mal damit:
	
	
	



```
select Email from stammdaten, zahldaten where stammdaten.Kundennr=zahldaten.Kundennr and Bezahlstatus='bezahlt';
```
ist nicht getestet, müsste aber funktionieren.

redlama


----------



## mobs (12. November 2004)

Solltest das von redlama nehmen. Ich bin gerade im Unterricht und bemerkte das INNER JOIN wohl nicht in php funktioniert...


----------



## mage (12. November 2004)

INNER JOIN Funktioniert glaub nur bei Access oder MS SQL Server, in MySQL ist das glaub entweder der EQUI JOIN oder nur JOIN.. schau am besten in die Doku von MySQL, da die Recht lang ist würde ich dort nach JOIN suchen..

Wenn in deiner Tabelle zahldaten die Kundennummer der Primärschlüssel ist, bedeutet dies das pro Kunde nur einmal Zahldaten vorhanden sein darf. 
Wenn du für diese Tabelle keinen natürlichen Schlüssel findest benutze einen künstlichen Primärschlüssel mit einem Autowert.
Die Kundennummer ist dann der Fremdschlüssel, der die Beziehung zur Tabelle Stammdaten herstellt.


----------



## hpvw (12. November 2004)

Bei dem von redlama solltest Du evtl. noch GROUP BY Kundennnr dranfügen, damit Du Einträge nicht doppelt bekommst, wenn ein Kunde schon mehrere Rechnungen beglichen hat, falls daas in Deiner Datenbank vorkommen kann. Es zeigt aber auch Kunden, die schon einmal bezahlt haben, ihre zweite Rechnung jedoch noch nicht.


----------



## redlama (12. November 2004)

hpvw hat gesagt.:
			
		

> Bei dem von redlama solltest Du evtl. noch GROUP BY Kundennnr dranfügen, damit Du Einträge nicht doppelt bekommst, wenn ein Kunde schon mehrere Rechnungen beglichen hat, falls daas in Deiner Datenbank vorkommen kann. Es zeigt aber auch Kunden, die schon einmal bezahlt haben, ihre zweite Rechnung jedoch noch nicht.


Wäre aber da nicht eher ein DISTINCT anstelle des GROUP BY angebracht?`

redlama


----------



## hpvw (12. November 2004)

redlama hat gesagt.:
			
		

> Wäre aber da nicht eher ein DISTINCT anstelle des GROUP BY angebracht?`
> 
> redlama



Klar   , aber warum einfach, wenns auch kompliziert geht?


----------



## redlama (12. November 2004)

Wie meinst Du das denn jetzt? 

redlama :suspekt:


----------



## hpvw (12. November 2004)

Deins ist einfach, vermutlich auch performanter, meins ist kompliziert.
Funktionieren wird vermutlich beides, wenn man es richtig macht.
Aber irgendwie bin ich heute morgen nicht auf DISTINCT gekommen.

Da habe ich mich vorhin wohl etwas unklar ausgedrückt.


----------



## redlama (12. November 2004)

Achso, ich dachte Dein Einwand würde sich gegen DISTINCT richten, ...

redlama


----------



## coyu (25. Februar 2005)

redlama hat gesagt.:
			
		

> Versuch's mal damit:
> 
> 
> 
> ...



Hey redlama, also es funktioniert so super, Vielen Dank!
Nur: wie formuliere ich das dazugehörige DELETE?
Wenn ich also diejenigen Datensätze in der Tabelle stammdaten löschen möchte, die die Rechnung in Tabelle zahldaten bezahlt haben?

Vielen Dank!

Coyu


----------



## redlama (28. Februar 2005)

Hi!

Du könntest Dir ja zusätzlich zur der Email auch noch die Kundennummer aus der Tabelle holen. Und dann machst Du einfach ein DELETE mit dieser Kundennummer:
	
	
	



```
delete from stammdaten where Kundennr='xyz';
```

redlama


----------

