CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
12.09.2010, 12:51:35
|
Anfänger
|
|
Registriert seit: Oct 2008
Alter: 44
Beiträge: 22
|
|
Join über 3 Tabellen
Hi,
mein Problem wird jetzt doch etwas größer ;-). Bisher habe ich die Tabellen stammdaten und fme erfolgreich so verknüpft, so dass ich nur die Einträge bekomme, die keine fme.gruppe haben:
http://www.selfphp.info/forum/showthread.php?t=23501
Jetzt kommt aber die Tabelle teiln_einsatz (te_id | id | e_id) hinzu. Ich möchte wissen, welche Datensätze aus meiner obigen Abfrage auch in teiln_einsatz bei einer bestimmten teiln_einsatz.e_id vorkommen. Hatte nun folgende Idee:
Zitat:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname,fme.gruppe
FROM teiln_einsatz
LEFT JOIN (stammdaten LEFT JOIN fme ON stammdaten.id = fme.id)
ON stammdaten.id = teiln_einsatz.id
WHERE teiln_einsatz.e_id='8' AND fme.gruppe IS NULL
|
Mit der Abfrage bekomme ich aber für alle gewünschten Werte nur NULL. Lasse ich den Teil "fme.gruppe IS NULL" weg, erhalte ich alle Einträge, aber bei keinem kommt die fme.gruppe=NULL vor ... Wo ist mein Denkfehler?? Danke.
__________________
Gruß,
Christian
|
12.09.2010, 13:27:32
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Join über 3 Tabellen
Die Klammer beim ..LEFT JOIN.. kommt mir etwas seltsam vor. Wie sieht denn das Ergebnis aus, wenn Du den SQL wie folgt umschreibst?
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname,fme.gruppe
FROM teiln_einsatz
LEFT JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8'
AND fme.gruppe IS NULL;
Damit wir hier nicht zuviel raten müssen, wäre es praktisch die Strukturen der drei beteiligten Tabellen (plus ein paar Testdaten) zu kennen.
Code:
mysql> SHOW CREATE TABLE teiln_einsatz;
...
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
12.09.2010, 14:18:48
|
Anfänger
|
|
Registriert seit: Oct 2008
Alter: 44
Beiträge: 22
|
|
AW: Join über 3 Tabellen
Hi,
die Tabellenstrukturen sehen wie folgt aus:
Code:
CREATE TABLE `teiln_einsatz` (
`te_id` int(5) NOT NULL AUTO_INCREMENT,
`e_id` int(5) NOT NULL,
`id` int(5) NOT NULL,
PRIMARY KEY (`te_id`)
) ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=latin1
Code:
CREATE TABLE `stammdaten` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(20) COLLATE latin1_general_ci NOT NULL,
`vorname` varchar(20) COLLATE latin1_general_ci NOT NULL,
`gebdatum` date NOT NULL,
`strasse` varchar(30) COLLATE latin1_general_ci NOT NULL,
`hsnr` varchar(5) COLLATE latin1_general_ci NOT NULL,
`plz` varchar(5) COLLATE latin1_general_ci DEFAULT NULL,
`ort` varchar(30) COLLATE latin1_general_ci DEFAULT NULL,
`tel` varchar(20) COLLATE latin1_general_ci DEFAULT NULL,
`handy` varchar(20) COLLATE latin1_general_ci DEFAULT NULL,
`telarbeit` varchar(20) COLLATE latin1_general_ci NOT NULL,
`email` varchar(40) COLLATE latin1_general_ci NOT NULL,
`email2` varchar(40) COLLATE latin1_general_ci NOT NULL,
`int_grup` varchar(15) COLLATE latin1_general_ci NOT NULL,
`int_zug` varchar(15) COLLATE latin1_general_ci NOT NULL,
`int_abt` varchar(15) COLLATE latin1_general_ci NOT NULL,
`fkt` varchar(6) COLLATE latin1_general_ci NOT NULL,
`akt` date NOT NULL,
`status` varchar(3) COLLATE latin1_general_ci NOT NULL,
`pass` varchar(40) COLLATE latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
Code:
CREATE TABLE `fme` (
`f_id` int(5) NOT NULL AUTO_INCREMENT,
`id` int(5) NOT NULL,
`gruppe` varchar(10) NOT NULL,
PRIMARY KEY (`f_id`)
) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=latin1
Noch zur Ergänzung: Es gibt auf jeden Fall Personen aus stammdaten, die keinen Eintrag in fme haben (also auch keine Meldergruppe). Diese Personen können aber trotzdem einen Eintrag in teiln_einsatz haben. Und genau diese Personen möchte ich selektieren!!
Zitat:
Die Klammer beim ..LEFT JOIN.. kommt mir etwas seltsam vor. Wie sieht denn das Ergebnis aus, wenn Du den SQL wie folgt umschreibst?
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname,fme.gruppe
FROM teiln_einsatz
LEFT JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8'
AND fme.gruppe IS NULL;
|
Wenn ich das verwende, bekomme ich ein leeres Resultat!
__________________
Gruß,
Christian
Geändert von Christian24 (12.09.2010 um 14:48:20 Uhr)
Grund: Ergänzung
|
12.09.2010, 15:19:30
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Join über 3 Tabellen
Gut, wir können uns ja mal rantasten.
Zitat:
Noch zur Ergänzung: Es gibt auf jeden Fall Personen aus stammdaten, die keinen Eintrag in fme haben (also auch keine Meldergruppe). Diese Personen können aber trotzdem einen Eintrag in teiln_einsatz haben. Und genau diese Personen möchte ich selektieren!!
|
Entsprechend Deiner Ergänzung, müsste also folgender SQL ein Ergebnis bringen. Stimmt das?
1)
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
WHERE teiln_einsatz.e_id='8'
EDIT
wenn nein, bei dieser Abfrage?
2)
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Geändert von thomas_w (12.09.2010 um 15:44:57 Uhr)
Grund: EDIT
|
12.09.2010, 22:15:54
|
Anfänger
|
|
Registriert seit: Oct 2008
Alter: 44
Beiträge: 22
|
|
AW: Join über 3 Tabellen
Hi,
Zitat:
Zitat von thomas_w
1)
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
WHERE teiln_einsatz.e_id='8'
|
Jepp, da kommt ein Ergebniss. Insgesamt 9 einzelne Datensätze. Das funktioniert wunderbar. Jetzt geht es nur noch darum, welcher von diesen Datensätzen eben KEINEN Eintrag in fme hat!! Da hakt es bei mir!
__________________
Gruß,
Christian
|
13.09.2010, 07:54:13
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Join über 3 Tabellen
Gut, dann gleich ein paar weitere Prüfungen:
3. Wieviele Datensätze kommen hier raus?
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname, fme.gruppe
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8';
4. Wieviele Datensätze kommen hier raus?
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname, fme.gruppe
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8';
5. Wieviele Datensätze kommen hier raus?
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname, fme.gruppe
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8'
AND fme.id IS NULL;
6. Aus dem Datenmodell geht nicht hervor, für was die Spalte ID der Tabelle FME steht.
Code:
CREATE TABLE `fme` (
`f_id` int(5) NOT NULL AUTO_INCREMENT,
`id` int(5) NOT NULL,
`gruppe` varchar(10) NOT NULL,
PRIMARY KEY (`f_id`)
) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=latin1
Beschreibt ID wirklich den Fremdschlüssel auf die Tabelle STAMMDATEN oder auf eine andere Tabelle? Da die Tabellenstrukturen leider keinen FOREIGN KEY Constraint aufweisen, ist der Zusammenhang der Tabellen anhand der Struktur nicht erkennbar.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
14.09.2010, 21:38:16
|
Anfänger
|
|
Registriert seit: Oct 2008
Alter: 44
Beiträge: 22
|
|
AW: Join über 3 Tabellen
Hi,
Zitat:
Zitat von thomas_w
3. Wieviele Datensätze kommen hier raus?
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname, fme.gruppe
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8';
|
Jetzt kommen nicht nur die 9 Datensätze, sondern insgesamt 13. Die Namen, die mehrere Einträge in fme haben, da sie nicht nur eine Gruppe haben, werden mit jeder Ihrer Gruppen angezeigt.
Zitat:
Zitat von thomas_w
4. Wieviele Datensätze kommen hier raus?
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname, fme.gruppe
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8';
|
13. Inhaltlich gleiches Ergebniss wie unter 3, allerdings in ner anderen Reihenfolge.
Zitat:
Zitat von thomas_w
5. Wieviele Datensätze kommen hier raus?
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname, fme.gruppe
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8'
AND fme.id IS NULL;
|
Leeres Resultat!
Zitat:
Zitat von thomas_w
6. Aus dem Datenmodell geht nicht hervor, für was die Spalte ID der Tabelle FME steht.
Code:
CREATE TABLE `fme` (
`f_id` int(5) NOT NULL AUTO_INCREMENT,
`id` int(5) NOT NULL,
`gruppe` varchar(10) NOT NULL,
PRIMARY KEY (`f_id`)
) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=latin1
Beschreibt ID wirklich den Fremdschlüssel auf die Tabelle STAMMDATEN oder auf eine andere Tabelle? Da die Tabellenstrukturen leider keinen FOREIGN KEY Constraint aufweisen, ist der Zusammenhang der Tabellen anhand der Struktur nicht erkennbar.
|
id ist tatsächlich der Fremdschlüssel auf STAMMDATEN
__________________
Gruß,
Christian
|
14.09.2010, 21:56:00
|
Anfänger
|
|
Registriert seit: Oct 2008
Alter: 44
Beiträge: 22
|
|
AW: Join über 3 Tabellen
Hi,
habs geschafft ;-). Nr. 5 mit einer kleinen Änderung ist die Lösung (fme.gruppe muss NULL sein):
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname, fme.gruppe
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8'
AND fme.gruppe IS NULL
Danke für die Hilfe!!!
__________________
Gruß,
Christian
|
15.09.2010, 07:53:22
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Join über 3 Tabellen
Zitat:
Zitat von Christian24
habs geschafft ;-). Nr. 5 mit einer kleinen Änderung ist die Lösung (fme.gruppe muss NULL sein):
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname, fme.gruppe
FROM teiln_einsatz
JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8'
AND fme.gruppe IS NULL
Danke für die Hilfe!!!
|
Schön das es jetzt funktioniert, aber so richtig verstehen kann ich es nicht. In der Nachricht #3 (weiter oben) war schon mal ein sehr ähnlicher SQL in der Diskussion:
Code:
SELECT stammdaten.id,stammdaten.name,stammdaten.vorname,fme.gruppe
FROM teiln_einsatz
LEFT JOIN stammdaten
ON stammdaten.id = teiln_einsatz.id
LEFT JOIN fme
ON fme.id = stammdaten.id
WHERE teiln_einsatz.e_id='8'
AND fme.gruppe IS NULL;
Dieser SQL hat "Empty set" als Ergebnis geliefert. Bis auf den LEFT JOIN unterscheidet er sich nicht.
Ebenso sollte es egal sein, ob die Spalte gruppe oder id der Tabelle fme geprüft wird. Wird kein passender Datensatz gefunden, haben beide Spalten den Wert NULL
Code:
a)
..
WHERE teiln_einsatz.e_id='8'
AND fme.gruppe IS NULL
b)
..
WHERE teiln_einsatz.e_id='8'
AND fme.id IS NULL
Aber egal, Hauptsache es funktioniert es bei Dir.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 21:34:35 Uhr.
|