SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Webseiten professionell erstellen

Webseiten professionell erstellen zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)
Hilfe Community Kalender Heutige Beiträge Suchen

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 12.09.2010, 12:51:35
Christian24 Christian24 ist offline
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
Mit Zitat antworten
  #2  
Alt 12.09.2010, 13:27:32
thomas_w thomas_w ist offline
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.
Mit Zitat antworten
  #3  
Alt 12.09.2010, 14:18:48
Christian24 Christian24 ist offline
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
Mit Zitat antworten
  #4  
Alt 12.09.2010, 15:19:30
thomas_w thomas_w ist offline
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
Mit Zitat antworten
  #5  
Alt 12.09.2010, 22:15:54
Christian24 Christian24 ist offline
Anfänger
 
Registriert seit: Oct 2008
Alter: 44
Beiträge: 22
AW: Join über 3 Tabellen

Hi,

Zitat:
Zitat von thomas_w Beitrag anzeigen
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
Mit Zitat antworten
  #6  
Alt 13.09.2010, 07:54:13
thomas_w thomas_w ist offline
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.
Mit Zitat antworten
  #7  
Alt 14.09.2010, 21:38:16
Christian24 Christian24 ist offline
Anfänger
 
Registriert seit: Oct 2008
Alter: 44
Beiträge: 22
AW: Join über 3 Tabellen

Hi,

Zitat:
Zitat von thomas_w Beitrag anzeigen
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 Beitrag anzeigen
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 Beitrag anzeigen
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 Beitrag anzeigen
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
Mit Zitat antworten
  #8  
Alt 14.09.2010, 21:56:00
Christian24 Christian24 ist offline
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
Mit Zitat antworten
  #9  
Alt 15.09.2010, 07:53:22
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Join über 3 Tabellen

Zitat:
Zitat von Christian24 Beitrag anzeigen
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.
Mit Zitat antworten
Antwort


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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
2 Counts über verschiedene Tabellen mit Join toxic3008 MySQLi/PDO/(MySQL) 2 06.11.2009 09:58:51
5 Tabellen durch JOIN verknüpft Callisto MySQLi/PDO/(MySQL) 0 10.10.2007 14:05:03
3 Tabellen Left Outer Join kevmaster MySQLi/PDO/(MySQL) 1 28.07.2007 14:59:53
Zwei Aggregatfunktionen in JOIN über drei Tabellen Nico #949494 MySQLi/PDO/(MySQL) 1 29.03.2007 14:47:58
4 Tabellen verknüpfen - INNER, OUTER und LEFT Join Franzx MySQLi/PDO/(MySQL) 0 13.11.2006 10:10:51


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:34:35 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt