Tabellenverknüpfungen auslesen

smyle

Erfahrenes Mitglied
Hallo, ich habe ein kleines Problem, welcher für euch sicher ein Kinderspiel sein wird.

Und zwar habe ich eine Datenbank mit 3 Tabellen.
Eine Haupttabelle: tbP
Eine zweite Tabelle die mit der Haupttabelle verknüpft ist: tbG
und eine dritte die auch mit der Haupttabelle verknüpft ist: tbS
--------------------------------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `tbP` (
`ID` int(11) NOT NULL,
`G_ID` int(11) NOT NULL,
`S_ID` int(11) NOT NULL,
usw.
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--------------------------------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `tbG` (
`ID` int(11) NOT NULL auto_increment,
`G` varchar(50) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=208 ;
--------------------------------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `tbS` (
`ID` int(11) NOT NULL auto_increment,
`S` varchar(50) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1067 ;
--------------------------------------------------------------------------------------------------------

Die ID von der Tabelle tbG ist mit der Spalte G_ID aus der Tabelle tbP so wie die ID Spalte aus tbS mit der Spalte S_ID aus tbP verknüpft ist (sieh Anhang).

Nun möchte ich alles aus der Tabelle tbP auslesen, jedoch möchte ich nicht die S_ID und die G_ID sondern das G aus der Tabelle tbG und die Spalte S aus der Tabelle tbS.

Wie kann ich das machen? Momentan habe ich folgendes, aber ich weis nicht weiter.

--------------------------------------------------------------------------------------------------------

SELECT * FROM tbP AS P, tbG AS G, tbS AS S WHERE P.G_ID = G.ID AND P.S_ID = S.ID
--------------------------------------------------------------------------------------------------------
 

Anhänge

  • db.jpg
    db.jpg
    14,1 KB · Aufrufe: 15
Wenn du willst, dass alle aus P genommen werdenm auch wenn G_ID oder S_ID mal leer sind, dann solltest du es über LEFT JOIN lösen

SQL:
SELECT
	p.ID,
	g.G,
	s.S
FROM
	tbP AS p
	LEFT JOIN tbG AS g
		ON p.G_ID = g.ID
	LEFT JOIN tbS AS s
		ON p.S_ID = s.ID

Wichtig ist, dass du im SELECT-Teil die Felder sauber ausgibsts, sonst (alsoe bei p.*, g.*, s.*) hast du nachher 3 Felder mit dem Namen ID und das gibt ein Durcheinander

Deine Lösung der Verknüpfung über den WHERE-Teil geht auch. Gibt jedoch nur die Datensätze aus P aus, die einträge in G_ID un S_ID haben.


Noch zum Schluss, bitte die DB noch mit angeben....
 
Zuletzt bearbeitet von einem Moderator:
könnte ich anstatt der tbS auch nochmal die tbG anwenden? Oder hat mySQL was dagegen?
Das sollte eigentlich gehen, oder yaslaw?




Jedenfalls habe ich ein anderes Problem mit MySQL :(
Ich benötige in einer Abfrage eine zweite und zwar folgender:
SQL:
SELECT p.Nachname, p.Vorname 
FROM ausbildner_lernender AS al,  lernende AS l, personal AS p, ausbildner AS au 
WHERE au.ID = al.Ausbildner_ID AND al.Lernende_ID = l.ID AND l.Personal_ID = p.ID
Die obere Abfrage kommt eigentlich gerade nach dieser abfrage:
SQL:
Select p.Nachname, p.Vorname, ac.Benutzername, ac.Passwort, ab.Abteilung 
From accounts AS ac, abteilungen AS ab,  personal AS p, ausbildner AS au  
WHERE  ac.Personal_ID  = p.ID AND p.Abteilungen_ID = ab.ID AND p.ID = au.Personal_ID

Im Grossen und Ganzen müsste es mir alle Ausbilder anzeigen lassen, mit deren Daten und deren Lernende.
Da ein Ausbilder mehrere Lernende haben kann, wird es leider für jeden Lernenden eine neue Zeile geben. Oder kann man alle Lernende nebeneinander anzeigen lassen?
Weiss jemand wie ich diese Abfrage machen kann?
PS: Beide Abfragen alleine funktionieren schon, das heisst die erste Abfrage zeigt mir die Namen der Lernenden an und bei der zweiten Abfrage werden die Namen und weiteren Daten der Ausbilder ausgegeben.

Gruss Smyle
 
Zuletzt bearbeitet von einem Moderator:
Schau doch mal, welche Möglichkeiten du hast, einen Report (Bericht) zu erstellen; vielleicht ist es das, was du haben willst.
 
Für manche Datenbanken gibt es einen Report-Generator bzw. Bericht-Generator, wo du angeben kannst, welche Daten du ausgeben willst, wie die Zeilen für Teil- und Gesamtsummen aussehen sollen etc. Durchforste mal die Website oder das Forum deines Datenbankherstellers, ob so etwas unterstützt wird. Wenn nicht, kannst du dir immer noch ein kleines Programm schreiben, das für deine Zwecke geeignet ist..
 
Hmm ja ich habe es gefunden.
Übrigens benutze ich Xampp Lite.
Jedoch gibt es ein Problem, denn die Namen der Lernende und die Namen der Ausbildner sind in der selben Tabelle.
SQL:
//Version 1
SELECT `personal`.`Nachname`, `personal`.`Vorname`, `personal`.`Vorname`, `personal`.`Nachname`
FROM `ausbildner`, `personal`, `ausbildner_lernender`, `lernende`
WHERE ((`personal`.`Typ` = "Ausbildner") AND (`ausbildner`.`ID` = ausbildner_lernender.Ausbildner_ID ) AND (`lernende`.`ID` = ausbildner_lernender.Lernende_ID) AND (`personal`.`Vorname` personal.ID = lernende.Personal_ID) AND (`personal`.`Nachname` personal.ID = lernende.Personal_ID))
ORDER BY `personal`.`Nachname` ASC, `personal`.`Vorname` ASC

//Version 2
SELECT `personal`.`Nachname`, `personal`.`Vorname`, `personal`.`Vorname`, `personal`.`Nachname`
FROM `ausbildner`, `personal`, `ausbildner_lernender`, `lernende`
WHERE (
       (`personal`.`Typ` = "Ausbildner") AND 
	   (`ausbildner`.`ID` = ausbildner_lernender.Ausbildner_ID ) AND 
	   (`lernende`.`ID` = ausbildner_lernender.Lernende_ID) AND 
	   (Select `personal`.`Vorname` From  personal, lernende Where personal.ID = lernende.Personal_ID) AND 
	   (Select `personal`.`Nachname` From personal, lernende Where personal.ID = lernende.Personal_ID)
	  )
ORDER BY `personal`.`Nachname` ASC, `personal`.`Vorname` ASC

Ich glaube in meiner Abfrage kann es nicht unterscheiden welcher personal.Nachname von dem Ausbildner ist und welecher vom Lernenden ist.

PS: Die obere MySQL Abfrage (Version 1) hat mir Xampp generiert und die untere (Version 2) habe ich noch ein wenig bearbeitet.

Gruss Smyle
 
Zuletzt bearbeitet von einem Moderator:
Du kannst Tabellen auch mehrfach in der FROM-Klausel verwenden, wenn du ihnen symbolische Namen gibst. Probiere also mal
SQL:
SELECT `lehrer`.`Nachname`, `lehrer`.`Vorname`, `azubi`.`Vorname`, `azubi`.`Nachname`
  FROM `ausbildner`
     , `personal lehrer`
     , `personal azubi`
     , `ausbildner_lernender`
     , `lernende`
 WHERE `lehrer`.`Typ` = "Ausbildner"
   AND `ausbildner_lernender`.`Ausbildner_ID` = `ausbildner`.`ID`
   AND `ausbildner_lernender`.`Ausbildner_ID` =   `lernende`.`ID`
   AND `azubi`.ID = `lernende`.`Personal_ID`
ORDER BY `lehrer`.`Nachname` ASC
       , `lehrer`.`Vorname`  ASC
 
Zuletzt bearbeitet von einem Moderator:
Ja ich denke das würde gehen.

Mein Problem war das ich die Vornamen und Namen aller Benutzer (Ausbildner & Lernende) in der selben Tabelle hatte.
Jetzt habe ich diese jedoch auseinander genommen und es funktioniert.

VIelen Dank für eure Mühe.
Ich melde mich wieder falls ich weitere Probleme haben werde.

Gruss und vielen Danke Smyle :D
 
Zurück