Website für Themenwahl erstellen

sabermaul

Semiprofi
Thread Starter
Mitglied seit
06.05.2007
Beiträge
3.741
Hallo!

Mein Klassenlehrer hat mir und drei Kameraden die Aufgabe gegeben, eine Website für die WG'ler zu erstellen, in der sie ihr Thema für GFS auswählen können sollen.

Da ich einige Fragen habe (und es werden sicher noch einige auftauchen) habe ich diesen Thread erstellt:

1. Ich habe eine Tabelle lehrer und themen. Wie "verknüpfe" ich diese Tabellen (n:m?) sodass ich eine Tabelle mit dem Namen "auswahl" mit den Feldern idAuswahl, idLeher, idThema habe und er beim Suchen der idLehrer oder idThema mir den Inhalt der verknüpften Tabellen mitschickt? Also wenn ich idLehrer 2 suche, soll er mir den kompletten Inhalt des Datensatzes mit der idLehrer 2 aus der Tabelle lehrer und den kompletten Datensatz mit der idThema aus der Tabelle themen "ausgeben".
GELÖST

2. Da es sehr viele Lehrer werden (> 50) sollte die Lehrerauswahl über ein Drop-Down-Menü erfolgen (das Menü an sich ist kein Problem).
Wie kann ich mit SQL abfragen, dass er z. B. nur alle Lehrer mit dem Anfangsbuchstaben A - H ausgibt (sollen dann mehrere DP-Menü's werden)?
GELÖST
PS: Das Projekt gibt keine Note! Freiwillige Arbeit :) Also keine Hausaufgabe ;)
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
1. hab ich gelöst.
Allerdings nicht wie von dir vorgeschlagen, habe eine SQL-Abfrage die die Daten des Themas abfrägt, in dieser Abfrage rennt dann eine los, die den Namen des zugehörigen Lehrers hol.
Dem 2. widme ich mich morgen.
 
Zuletzt bearbeitet:
hol dir alles lehrer mit einem SQL state und zersaeg die ergebnissliste dann mit array_slice und verteil sie auf die dropdowns
 
Noch mal eine Frage: Kann ich daraus nicht eine Abfrage machen? Finde ich etwas umständlich meine beiden Abfragen, aber mit FROM schueler, lehrer komme ich irgendwie nicht klar :(

PHP:
$SQLString = "SELECT * FROM themen ORDER BY Thema ASC";
mysql_select_db($dbname, $verbindung);
$Ergebnis = mysql_query($SQLString, $verbindung);
if($Ergebnis)
{
	$Datensatz = mysql_fetch_array($Ergebnis);
	while ($Datensatz)
	{
		$Thema = $Datensatz[Thema];
		$idThema = $Datensatz[idThema];
		$Fach = $Datensatz[Fach];
		$Termin = $Datensatz[Termin];
		$Bemerkung = $Datensatz[Bemerkung];
		$Belegt = $Datensatz[Belegt];

		$SQLStringInnen = "SELECT * FROM lehrer WHERE idLehrer = '$Datensatz[idLehrer]'";
		$ErgebnisInnen = mysql_query($SQLStringInnen, $verbindung);
		if($ErgebnisInnen)
		{
			$Datensatz = mysql_fetch_array($ErgebnisInnen);
					$LName = $Datensatz[LName];
		}

		$Datensatz = mysql_fetch_array($Ergebnis);
		echo "<tr>
			<td>$Thema</td>
			<td>$LName</td>
			<td>$Fach</td>
			<td>$Termin</td>
			<td>$Bemerkung</td>
			<td>$Belegt</td>";
		echo "</tr>";
	}
}
 
Zuletzt bearbeitet:
Select * from lehrer inner join auswahl on auswahl.idlehrer=lehrer.id inner join themen on auswahl.idthema=themen.id where [hier beliebige bedingung einfügen. Alle spalten der 3 Tabellen stehen zur verfügung]

Vorausgesetzt die angegebenen Tabellen und Spaltennamen oben stimmen.

Zu Problem 2 aus deinem Anfangspost. Select * from lehrer where name between 'a' and 'i' or name between 'A' and 'I'
Auf meiner Oracle Datenbank geht das jedenfalls. Es wird A-H und a-h ausgegeben.
 
Jetzt stehe ich wieder auf dem Schlauch: Da kommen nur die, die ein Thema gewählt haben?? Wie kann ich das ändern?
PHP:
$SQLString = "SELECT * FROM schueler
		        INNER JOIN lehrer
   	               ON schueler.Klassenlehrer = lehrer.idLehrer
		      INNER JOIN themen
		      ON schueler.1HJ = themen.idThema
	       ORDER BY schueler.SName ASC";
		mysql_select_db($dbname, $verbindung);
		$Ergebnis = mysql_query($SQLString, $verbindung);
		if($Ergebnis)
		{
			$Datensatz = mysql_fetch_array($Ergebnis);
			while($Datensatz)
			{
				echo "<tr><td>$Datensatz[SName]</td>
						  <td>$Datensatz[SVorname]</td>
						  <td>$Datensatz[Thema]</td>
						  <td>$Datensatz[Abiam]</td>
						  <td>$Datensatz[LName]</td>
					  ";
					$Datensatz = mysql_fetch_array($Ergebnis);
			}
		}

Bei den Themen funktioniert es:
PHP:
			$SQLString = "SELECT * FROM lehrer INNER JOIN themen
						  ON (lehrer.idLehrer = themen.idLehrer)
						  WHERE lehrer.idLehrer = '$idLehrer'
			     		  ORDER BY themen.Thema ASC";

Allerdings werden hier nur zwei Tabellen "eingelesen".
 
Zuletzt bearbeitet:
Zum 2. Block. Wenn du nur die 2 Tabellen haben willst, ist der SQL Befehl so korrekt. Kannst natürlich auch noch eine 3 Tabelle hinzufügen. Du musst sie nur irgendwie mit den vorhandenen Spalten verknüpfen. Auch ein "Inner Join XY on a=b and c=d" oder "Inner join XY on a betwenn b and c" ist möglich.

Zum 1. Block. Versuch erstmal nur einen der Inner Joins und schau ob die Daten stimmen. Danach machst du das nochmal mit dem 2. Inner Join aber ohne den 1. Inner Join. Schau mal was dabei rauskommt. Ich vermute mal, dass der 2. Innerjoin nur 1 Datensatz liefert. Das würde dann auch erklären warum beide Inner Joins zusammen auch nur einen Datensatz liefern. Kann es sein, dass viele schüler.1HJ teilweise Null sind oder aber die ID in der Thementabelle garnicht vorhanden ist? Falls ja kommst du eventuell mit einem Outer Join weiter. Meld dich einfach falls du dafür Hilfe brauchst.
Inner Joins zeigen dir alle Datensätze, die in beiden Tabellen vorhanden sind. Jeder Datensatz, der nur in einer der beiden Tabellen vorhanden ist, fliegt raus. Wenn du also zum Beispiel eine Kundentabelle und eine Ansprechpartner Tabelle hast und zwischen beiden besteht keine 1:n sondern eine 0:n Beziehung (Nicht jeder Kunde hat einen Ansprechpartner), kannst du kein Inner Join sondern ein Left oder Rigth Outer Join verwenden.
 
Einen Klassenlehrer hat der Schüler immer, aber oftmals noch kein Thema (1HJ = 1. Halbjahr, enthält die id des Themas)
So geht es:
PHP:
		$SQLString = "SELECT * FROM schueler
					  INNER JOIN lehrer
				      ON (schueler.Klassenlehrer = lehrer.idLehrer)
				      LEFT JOIN themen
				      ON (schueler.1HJ = themen.idThema)
				      ORDER BY schueler.SName ASC";
 
Noch ein paar Fragen:
Stimmen die n:1? Oder habe ich das genau falsch herum verstanden?
Wenn sich jemand beim eintippen des Lehrernamens beim nachträglichen Einfügen von Themen vertippt, kann ich dem mit dem SQL-Befehl "LIKE" entgegenwirken, bzw. abhelfen, dass es beim richtigen Lehrer landet?
Bei Faecherkombination muss das INTEGER natürlich SMALLINT heißen ;)
HJ bei Themen soll Halbjahr heißen (nicht das was ihr jetzt denkt :d), sodass manche Themen nur im 1. Halbjahr, andere im 2. Halbjahr oder in beiden Halbjahren gewählt werden können.

#Edit: Nicht wundern, wenn die Fragen etwas Anfängerhaft sind. Wir haben nach den Weihnachtsferien in der Schule erst mit ASP angefangen und von DBs sind wir noch ein paar Wochen entfernt. Bis jetzt habe ich privat auch noch keine Tabellen miteinander verknüpfen müssen und vom ER-Modell und Kardinalität & Co noch nichts gewusst.
 
Zuletzt bearbeitet:
IDLehrer hat verschiedene Datentypen.

Der Updatebefehl muss natürlich die ID des Lehrer beinhalten. Du kannst also nach der (falschen) eingabe des Schülers mit Like einfach alle gefundenen Lehrer auflisten und er soll sich für eine IDLehrer entscheiden.

Wofür soll die Darstellung sein? Ein ERM sieht anders aus. Solltes du dafür einen Zensur bekommen, solltest du besser ein richtig tolles ERM basteln. Falls es keine Zensur gibt, kannst du es einfach so lassen.

Die Zwischentabellen dürfen in deinem Fall keinen eigenen Primärschlüssel haben. Es muss in dem Fall ein zusammengesetzter Primärschlüssel sein. Damit verhinderst du einfach, dass ein Datensatz doppelt eingetragen wird. Ich hoffe du willst keine weitere Tabelle einbauen, die dann auf die Zwischentabelle verweist. Dann wäre das wieder etwas komplizierter und man müsste über Unic Constrains das Problem lösen. Ein zusammengesetzter Primärschlüssel ist einfach schöner :)

Die Verbindung zwischen Thema und Lehrer ist nicht eingezeichnet.

Ansonsten wären ein paar Beispieldatensätze (5 pro Tabelle) nicht schlecht. Damit kann man sehr einfach die 3 Normalformen überprüfen. Ich glaube bei dir sind die nicht erfüllt aber ohne Beispieldatensätze kann ich das sogenau auch nicht sagen. Schau dir nochmal genau die HJ an und beim Thema speicherst du nochmal das Fach ab obwohl das bereits über den Lehrer zur verfügung steht.

"Belegt" macht auch wenig Sinn. Das sind Prozessdaten. Man speichert nicht ob das Thema belegt ist. Man speichert die Anzahl der Plätze und überprüft mittels SQL wieviele das Thema bereits gewählt haben. Stell dir mal vor du speicherst beim Schüler nicht das Geburtsdatum sondern sein Alter. Jetzt schmiert die Datenbank ab und der Job, der das alter Hochzählen soll, wird nicht ausgeführt. Dann hast du ein Problem. Darum keine Prozessdaten speichern sonder diese Daten jedesmal neu ausrechnen.
 
Zusammengesetzter Primärschlüssel habe ich bereits eingeplant. Ein richtiges ERM soll das auch nicht sein.
Und nein, das gibt zum Glück keine Note :)

Ich muss den Screen verbessern, habe doch glatt den falschen hochgeladen ^^
 
Problem 2 ist noch nicht gelöst? Funktioniert das SQL Statement bei dir nicht?
 
Doch, klappt schön :) Nur noch keine Zeit gefunden, zu berichten.
Ich werde jetzt mal ein paar Beispieleinträge für die DB erfinden.

Die Spalte 1HJ und 2HJ einfach ignorieren, werde ich noch löschen.

Habe eine Test-DB erstellt. little_skunk hat die Zugangsdaten grad per PN bekommen ;)
 
Zuletzt bearbeitet:
Danke für die Zugangsdaten. Die Beispieldaten haben sehr geholfen. Hast gute Arbeit geleistet. Sieht soweit schon ganz gut normalisiert aus. Einige Sachen hast du bereits eingebaut.

Bei der Tabelle "Auswahl" hast du noch keine Beispieldatensätze aber da kann ich mir meinen Teil auch denken. Da solltest du dir nochmal die Sache mit dem zusammengesetzten Primärschlüsseln überlegen.

Fächerkombination kann ebenfalls einen zusammengesetzten Primärschlüssel erhalten. Ich hab das mal angeklickt. War mir nicht ganz sicher ob MySQL damit klarkommt. Wofür brauchst du die Tabelle überhaupt. Ich kann die Fächerkombinationstabelle auch aus der Thementabelle rekonstruieren. Dort werden zu jedem Thema ein Fach und ein Lehrer gespeichert. Einige Daten sind also doppelt. Die Tabelle macht also nur sinn, wenn du beim anlegen des Themas irgendwie prüfst, ob die Angaben stimmen. Ansonsten sehe ich keinen Sinn in der Tabelle.
 
Die Tabelle Faecherkombination hat sich der zuständige Lehrer überlegt. Ich hab mir das gerade mal durch den Kopf gehen lassen, werde aber daraus nicht schlau, ich werde ich nächste Woche darauf ansprechen.

Ich hänge gerade wieder an einem Problem, da eigentlich ja ganz einfach sein sollte.
Ich möchte, dass ich alle Schüler bekomme, deren idSchueler nicht in der auswahl tabelle vorkommt. Ich bekomme aber entweder nur die, die drinstehen oder gar keine.

So weit bin ich:
PHP:
		$SQLString = "SELECT * FROM schueler
					INNER JOIN lehrer
				      ON schueler.Klassenlehrer = lehrer.idLehrer
				      JOIN auswahl
				      ON schueler.idSchueler = auswahl.idSchueler
				      WHERE schueler.idSchueler = auswahl.idSchueler
				      ORDER BY schueler.SName ASC";

Jedoch findet er da nur die Schueler, die ein Thema haben. Ich möchte aber alle Schueler, deren idSchueler nicht in der Tabelle auswahl vorkommt. Habe wohl gerade ein Brett vor dem Kopf ...
 
Zuletzt bearbeitet:
Das zauberwort heißt "IN".

SELECT * FROM schueler WHERE schueler.id NOT IN (SELECT idschueler FROM auswahl GROUP BY idschueler)

Da fehlt dann allerdings noch dein HJ. Das müsstest du als WHERE Klausel vor dem GROUP BY platzieren. Momentan gibt das SQL Statement alle Schüler aus, die noch nie was gewählt haben. Ich vermute aber du suchst nur die Schüler, die für die aktuell anstehende Wahl noch keine Auswahl getroffen haben.

Edit: Ich hab das SQL Statement natürlich nicht getestet. Ich bin dann übrings erst Sonntag Abend wieder an einem PC mit Internetanschluss.
 
Zuletzt bearbeitet:
Ohne HJ beim Schüler passt schon (siehe unten) (im Thema wird unter HJ gespeichert in welchem Halbjahr das Thema gewählt werden können soll.)
Irgendwie was mit IST NICHT hab ich gesucht. Denke doch, dass ich das mit NOT IN hin bekomme.

#Edit: Geht, war kein Problem :)

Ich vermute aber du suchst nur die Schüler, die für die aktuell anstehende Wahl noch keine Auswahl getroffen haben.

Danke für die Erinnerung. Da muss ich wohl doch die 1HJ und 2HJ bei den Schülern wieder hinzufügen. Einmal im Schuljahr muss dann halt der Inhalt von 1HJ u. 2HJ bei allen Schülern geflusht werden und bei der Wahl muss TRUE eingetragen werden.

DAS MUSS ICH MIR MAL GRÜNDLICH DURCH DEN KOPF GEHEN LASSEN, SONST MACHE ICH WEITER UND DANN MUSS ICH ALLES WIEDER ANPASSEN.
 
Zuletzt bearbeitet:
Mal wieder ein Problem:
PHP:
SELECT * FROM schueler
INNER JOIN lehrer
ON schueler.Klassenlehrer = lehrer.idLehrer
LEFT JOIN auswahl
ON auswahl.idSchueler = schueler.idSchueler
LEFT JOIN themen
ON auswahl.idThema = themen.idThema
ORDER BY schueler.SName ASC

Habe gerade bemerkt, dass ich bei obiger Abfrage nur die idSchueler bekomme, wenn dieser ein Thema gewählt hat (also seine idSchueler in der auswahl Tabelle vorkommt). Wie bekomme ich diese idSchueler bei allen Schülern zu sehen?
 
wer benutzt denn noch Joins, habt ihn zuviel rechenpower ;)

probiert mal "LEFT OUTER JOIN themen"
 
Vom Ergebnis gesehen, kommt doch das gleiche raus wenn ich "LEFT OUTER JOIN themen" oder "LEFT JOIN themen" nehmen.

Dies löst mein Problem jedoch leider nicht. Notfalls mach ich halt eine zweite DB-Abfrage um die idSchueler herauszufinden, das kostet dann allerdings Rechenleistung^^
 
wer benutzt denn noch Joins, habt ihn zuviel rechenpower ;)

probiert mal "LEFT OUTER JOIN themen"

Das sind ja gleich 2 Fehler auf einmal. Inner Joins sind in der Regel schneller als eine Abfrage über mehrere Tabellen mit entsprechenden Where Bedingungen. Es gibt Außnahmen aber die werden bei einer solch "leichten" Datenbank wie die vorliegende wohl nicht anzutreffen sein. So und nun verate mir doch mal den Unterschied zwischen Left Join und Left Outer Join.

Nun zu dem eigentlichen Problem:
Ich sehe erstmal keine Fehler. Die 2 Left Joins sollten hinhauen. Hab mich zum Test auch nochmal mit der Datenbank verbunden, deren Zugangsdaten du mir damals zugeschickt hast. Ich sehe da genau 3 Schüler und alle werden angezeigt. Sollte also stimmen oder nicht?

Edit: Ich hab mir nochmal dein Problem durchgelesen. Irgendwas haut da nicht hin. Ich verwende genau deinen SQL Befehl bei deiner MySQL Datenbank und da haut alles hin. Ist die ID des Schülers nicht in der Auswahltabelle, dann werden die Felder mit "Null" aufgefüllt. So sollte es auch sein. Wo und wie schickst du den SQL Befehl ab?
 
Zuletzt bearbeitet:
So und nun verate mir doch mal den Unterschied zwischen Left Join und Left Outer Join.
jaha, fehler... war verwirrt :fresse: ich neige dazu immer nochmal outer explizit zu schreiben nur um auf nummer sicher zu gehen. Ist aber vom Ergebnis das gleiche.

Wegen der Performance meinte ich, dass viele performancekritische Anwendungen dazu neigen nur eine Tabelle auf einmal abzufragen. Laesst sich besser cachen und ist vor allem in der Entwicklung IMHO deutlich einfach, weil man sich genau solche Sachen wie hier spart. Wer-kennt-wen.de ist da ein Beispiel, da sind Joins bei Todesstrafe verboten ;)
 
Zuletzt bearbeitet:
Wegen der Performance meinte ich, dass viele performancekritische Anwendungen dazu neigen nur eine Tabelle auf einmal abzufragen. Laesst sich besser cachen und ist vor allem in der Entwicklung IMHO deutlich einfach, weil man sich genau solche Sachen wie hier spart. Wer-kennt-wen.de ist da ein Beispiel, da sind Joins bei Todesstrafe verboten ;)

Eben nicht. Es ist in der Entwicklung zwar einfach aber frisst mehr Performance. Wobei "einfach" da auch das falsche Wort ist. Das richtige Wort wäre eher "Unwissenheit". Wir alle haben mal klein Angefangen und man sieht bei sabermaul deutliche Vortschritte. Mit noch ein wenig mehr Übung macht es dann keinen Unterschied mehr. Dann ist es genauso einfach mit Inner Joins zu arbeiten.

Dem Cach ist es völlig egal ob er eine Abfrage mit Inner Join oder ohne speichern soll. Das macht der so oder so. Noch ein Grund mehr Inner Joins zu verwenden, da die Antwortmenge kleiner ist als mit 2 seperaten SQL Statesments. Genau da spielt dann auch die Performance eine Rolle. Beim Inner Join liefert die Datenbank genau die Daten, die ich haben will. Nimm mal die gleiche Abfrage und lasse dir alle Spalten anzeigen bei sonst unveränderten SQL Statement. Der Datenbankserver liegt zwar genau auf der gleichen Maschiene wie der Web Server aber trotzdem müssen die Daten erstmal übertragen werden. Selbiges passiert dann auch, wenn man 2 einzelne SQL Statetments abschickt. Da sind dann fast zwangsweise Daten mit dabei, die man zwar für weitere SQL Statements braucht aber mit einem Inner Join garnicht benötigt werden würden.

Solltest du mit deiner Aussage ein normales Select Statement mit 2 oder mehr Tabellen im From Teil meinen, so solltest du dir mal die Frage stellen was ein DBMS daraus macht. Es versucht diese Abfrage so gut es geht zu "verbessern" um so möglichst schnell ausführen zu können. Im günstigen Fall komm dabei das gleiche raus wie beim Inner Join. In Außnahmefällen (fragwürdiges Datenbankdesign) macht das DBMS beim Inner Join einen Fehler und somit wäre der Natural Join schneller. In der Regel ist der Inner Join aber schneller als der Natural Join.
 
Zuletzt bearbeitet:
Grundsätzlich sollte man Entitäten immer möglichst atomisieren bzw. normalisieren.
Performance-Fragen sind aber um einiges komplexer, als dass die hier abgehandelt werden können. Dazu kommt, dass sich jede Datenbank-Engine zum Teil völlig anders verhält.

Bei komplexen Joins verwende ich persönlich bei Verwendung von MySQL die Views ganz gern. Dort bleibt die normale Form der Daten und die Einfachheit der Abfragen erhalten.
 
Dem kann ich nur 100% Zustimmen. Die Performance hängt natürlich von einer Reihe von Faktoren ab.
Einer der Faktoren sind aber meiner Erfahrung nach die Inner Joins in Verbindung mit genau den Spalten, die man auch angezeigt haben möchte. Je mehr Spalten man abfragt obwohl man sie garnicht anzeigen möchte, um so langsamer wird es. Gleiches passiert auch wenn man unötige Datensätze erst im Programm rausfilter oder sortiert. Das kann die Datenbank auch deutlich schneller. Wenn man die 2 Regeln beachtet, ist es fast egal ob man nun Natural oder Inner Joins verwendet. Das ist dem DBMS hoch wie breit. Der Inner Join wird in der Regel ein klein wenig schneller sein.

Das Performance Problem gehört hier zwar eigentlich nicht zum Thema aber wenn man schon SQL lernt, dann wenigstens auch richtig. Man kann sich auch einreden, dass Inner Joins zu unübersichtlich und langsam sind... Das wollte ich nur mal richtig stellen.

Wo wir gerade bei Views sind. MySQL kann auch Stored Procedures. Wäre vieleicht auch noch ein interessantes Thema für den ein oder anderen :)
 
Solltest du mit deiner Aussage ein normales Select Statement mit 2 oder mehr Tabellen im From Teil meinen
nein, meine ich nicht. Ich meine die Regel "Eine Tabelle, ein Query" wenn ich Daten aus mehreren Tabellen brauche mache ich mehrere Abfragen und merge dass das in der Anwendung zusammen wenn benoetigt. Da hab ich mich wohl unklar ausgedrueckt.

Fuers Protokoll: Wenn es darum geht mit einer Abfrage auf mehrere Tabellen zuzugreifen, dann sind Joins die beste und einzig sinnvolle Wahl. Nichts anderes meinte ich von Anfang an. Ob man es will mit einer Abfrage mehrere Tabellen abzufragen ist eine andere Sache aber das gehoert hier nicht hin.

Sabbermaul: bist du inzwischen weitergekommen? Ich hab mir grad ne kleine db aufgesetzt mit der struktur wie ich sie anhand deiner posts vermute und da kommt wie erwartet ein "null" raus wenn noch keine thema gewaehlt wurde. Da stimme ich little_skunk zu, das Statement scheint korrekt zu sein. Womit fragst du die Datenbank denn ab? Vielleicht setzt deine Datenbankblibliothek irgendwelche obskuren Flags?
 
Zuletzt bearbeitet:
Noch keine Zeit gehabt, wird heute wohl auch nichts mehr.
Die hier gepostete Version ist etwas alt, daher lad ich es noch mal hoch.

http://phpmyadmin.ddjb.dd.ohost.de/
Benutzername: ddjb_01
Passwort: ddjbddjb

Habe gerade entdeckt, dass der Befehl ja zweimal die Spalte idSchueler liefert, einmal aus der Tabelle schueler und einmal aus auswahl - ich kann da wohl nur auf idSchueler von auswahl zugreifen, und Schüler ohne Thema sind da ja nicht drin. Ich brauche aber auch die idSchueler der Schüler ohne Thema
Hier noch mal die Abfrage:
PHP:
SELECT * FROM schueler
INNER JOIN lehrer
ON schueler.Klassenlehrer = lehrer.idLehrer
LEFT JOIN auswahl
ON auswahl.idSchueler = schueler.idSchueler
LEFT JOIN themen
ON auswahl.idThema = themen.idThema
ORDER BY schueler.SName ASC;

Edit: [...] Wo und wie schickst du den SQL Befehl ab?

PHP:
$SQLString = "SELECT * FROM schueler
		  INNER JOIN lehrer
		  ON schueler.Klassenlehrer = lehrer.idLehrer
		  LEFT JOIN auswahl
		  ON auswahl.idSchueler = schueler.idSchueler
		  LEFT JOIN themen
		  ON auswahl.idThema = themen.idThema
		  ORDER BY schueler.SName ASC;";
[...]
$Ergebnis = mysql_query($SQLString, $verbindung);

if($Ergebnis)
{
	$Datensatz = mysql_fetch_array($Ergebnis);
	while($Datensatz)
	{
             [...]
		echo "<td><a href=\"[...].php?idSchueler=$Datensatz[idSchueler]\">ändern</a>";
		$Datensatz = mysql_fetch_array($Ergebnis);
	}
}
else
{
	echo mysql_error();
	echo "DB Zugriff nicht möglich! Schülerliste";
}
 
Zuletzt bearbeitet:
versuch mal beim select die felder die du brauchst explizit anzugeben. also zb. "SELECT schueler.schuelerId, schueler.name FROM ..." mit nur den Feldern die du brauchst.

aber mir ist noch was anderes aufgefallen. Du solltest Variablen nicht direkt in einen String schreiben.

PHP:
//nicht:
        echo "<td><a href=\"[...].php?idSchueler=$Datensatz[idSchueler]\">ändern</a>";

//stattdessen:
        echo '<td><a href="[...].php?idSchueler=' . $Datensatz['idSchueler'] .'">ändern</a>';
das macht den code lesbarer, weil du zum einen nicht noch die doppelten Anfuehrungszeichen escapen musst und man variablen schneller findet. hat aber nix mit dem problem zu tun.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh