Schusselfehler Kontrollstruktur? PHP / MySQL

Wie wärs einfach mit
Code:
SELECT *.tabelle, marke.marke, sparte.sparte
FROM tabelle
LEFT JOIN marke ON marke.markenid=tabelle.markenid
LEFT JOIN sparte ON sparte.spartenid=tabelle.spartenid
 
Ich habe mich mit Joins nie richtig auseinandersetzen müssen. Dehalb verzeih meine Frage, aber das geht doch nur, wenn ich Werte für die Ids habe, oder?
Da es aber ziemlich häufig vorkaommen kann, dass nur ein Wert vorhanden ist, klappt doch die Abfrage nicht und ich habe das gleiche Problem...
 
Entschuldigung, dass es so lange gedauert hat. Bin unterwegs und hier sieht es mit einem Netz ziemlich schlecht aus. (spätestens am Wochenende wieder)

Ich poste mal den ganzen Code der Seite, Erklärung folgt unten:
PHP:
   $sql="SELECT schulungen_ort.schID, 
   schulungen_ort.schulungsname, schulungen_ort.veranstalter, 
   schulungen_verkn_thema_name.thema, schulungen_themen.id, 
   schulungen_themen.name, schulungen_themen.ziele, 
   veranstalter.veranstalter, veranstalter.veranstalterid,
   schulungen_termine.verkn_ort, schulungen_termine.schanfangdatum, 
   schulungen_termine.schenddatum, schulungen_termine.ort, 
   schulungen_termine.trainer, schulungen_ort.dauerinst, 
   trainer.Titel, trainer.vorname, 
   trainer.nachname, trainer.trainerID, 
   schulungen_termine.verkn_fbb,schulungen_ort.code, 
   schulungen_ort.marke,  schulungen_ort.sparte,
   schulungen_ort.charterway, schulungen_termine.hotel
   
   FROM schulungen_ort, schulungen_verkn_thema_name, schulungen_themen, veranstalter, schulungen_termine, trainer
   WHERE schulungen_verkn_thema_name.name = schulungen_ort.schID
   AND schulungen_themen.id = schulungen_verkn_thema_name.thema
   AND veranstalter.veranstalterid = schulungen_ort.veranstalter
   AND schulungen_ort.schID = schulungen_termine.verkn_ort
   AND trainer.trainerID = schulungen_termine.trainer
   $neworder
   ";
   
   $dbanfrage=mysql_query($sql);
   while ($werte=mysql_fetch_row($dbanfrage)) {
   	 echo " <tr> "; 
 		echo "<td valign=\"top\">$werte[7] </td>";	 #va
 		echo "<td valign=\"top\"><a href=\"index.php?bereich=schulungdetail&schulungsid=$werte[0]\">$werte[1] </a></td>"; 	#seminarname
 		echo "<td valign=\"top\">$werte[20] &nbsp;</td>";	#code
 		echo "<td valign=\"top\">&nbsp;</td>"; 	#änderung
 		echo "<td valign=\"top\">".date("d.m.",$werte[10])." bis ".date("d.m.Y",$werte[11])."</td>";	#termine
 		echo "<td valign=\"top\">$werte[15] $werte[16] $werte[17]</td>"; 		 		 		#ref
 		echo "<td valign=\"top\">$werte[14] </td>"; 	#dauer
   			
   			if ( empty($werte[21]) and empty($werte[22])   ){
 		 		echo "<td valign=\"top\"> &nbsp; / &nbsp;</td>"; 		#beide leer
   			}
 			elseif (($werte[21] != "0" and $werte[22] != "0") or ($werte[21] != "" and $werte[22] != "")){
 				$markespartesql="select marke.marke, sparte.sparte 
   				from marke, sparte
 				where sparte.spartenid = $werte[22]
 				and marke.markenid = $werte[21]";
 				$markesparteanfrage=mysql_query($markespartesql);
 				$daten=mysql_fetch_row($markesparteanfrage);
 		 		echo "<td valign=\"top\">] $daten[0] / $daten[1]</td>"; 	#marke sparte 
   			}
   			elseif ( empty($werte[22])  ){
 		 	$markespartesql="select marke.marke	from marke	where marke.markenid = $werte[21]";
 				$markesparteanfrage=mysql_query($markespartesql);
 				$daten=mysql_fetch_row($markesparteanfrage);
 		 		echo "<td valign=\"top\"> $daten[0] / </td>"; 			#nur marke
   			}
   			elseif ( empty($werte[21]) ){
 		 	$markespartesql="select sparte.sparte from sparte	where sparte.spartenid = $werte[22]";
 				$markesparteanfrage=mysql_query($markespartesql);
 				$daten=mysql_fetch_row($markesparteanfrage);
 		 		echo "<td valign=\"top\"> / $daten[0]</td>"; 			#nur sparte
   			}
   			
 		echo "<td valign=\"top\">$werte[23] &nbsp;</td>"; 	#cw
Die erste Abfrage erstellt aus allen Tabellen die notwendigen Daten für die Übersicht. Am einfachsten wäre es, wenn ich hier in die WHERE-Klausel schreibe:"WHERE schulungen_ort.marke = marke.markenID". Das geht aber leider nicht, da dann nur eine Zeile herauskommt. Ich möchte aber alle Zeilen abarbeiten und für jede Zeile die Marke bzw. Spalte neu bestimmen. Deshalb habe ich die Marken/Sparten -Abfrage auch weiter unten angesetzt. Das Problem ist, dass es passieren kann, dass der Inhalt von Marke / Sparte nicht angegeben wurde. Nun habe ich das Problem, es in einer IF-Anweisung zu überprüfen und die Abfrage so durchzuführen, dass keine Fehlermeldung erscheint. Also gibt es 4 Fälle:
1) Marke und Sparte sind leer: dann schreibe " / " in die Spalte
2) Marke und Sparte sind gesetzt: dann schreibe "Marke x / Sparte y"
3) nur Marke ist gesetzt : schreibe "Marke x / "
4)nur Sparte ist gesetzt: schreibe " / Sparte y"

($neworder gibt nur die Sortierreihenfolge an, ist also irrelevant)

Struktur:
Tabelle marke
markenID
marke

Tabelle sparte
spartenID
sparte

Tabelle schulungen_ort
...
marke
sparte
...

Beziehung:
schulungen_ort.marke = marke.markenID
schulungen_ort.sparte = sparte.spartenID


Mehr will ich doch nicht *heul*! Bin ich nur zu doof? Das klappt doch sonst ...
Vielleicht kann ja och noch einer helfen *freu*
 
So, manchmal braucht man auch mehr als 3 Tage Abstand von einem Thema. Ich habe es jetzt einfach ganz anders geschrieben ;) Da die Werte imme größer als 1 sind, konte ich die Bedingungen wie folgt abwandeln:
(leider hat das aus irgendwelchen Gründen nicht mit dem empty() funktioniert)
PHP:
  if ($werte[21] < 1 and $werte[22] < 1){
 		 		echo "<td valign=\"top\"> &nbsp; / &nbsp; </td>"; 	#beide leer
  			}
  			elseif ($werte[21] > 0 and $werte[22] > 0) {
 				$markespartesql="select marke.marke, sparte.sparte 
  				from marke, sparte
 				where sparte.spartenid = $werte[22]
 				and marke.markenid = $werte[21]";
 				$markesparteanfrage=mysql_query($markespartesql);
 				$daten=mysql_fetch_row($markesparteanfrage);
 		 		echo "<td valign=\"top\"> $daten[0] / $daten[1] </td>"; 	#marke sparte 
  			}
  			elseif ( $werte[22] < 1 and $werte[21] > 0)  {
 		 	$markespartesql="select marke.marke	from marke	where marke.markenid = $werte[21]";
 				$markesparteanfrage=mysql_query($markespartesql);
 				$daten=mysql_fetch_row($markesparteanfrage);
 		 		echo "<td valign=\"top\">$daten[0] / &nbsp; </td>"; 			#nur marke
  			}
  			elseif ( $werte[21] < 1 and $werte[22] > 0){
 		 	$markespartesql="select sparte.sparte from sparte	where sparte.spartenid = $werte[22]";
 				$markesparteanfrage=mysql_query($markespartesql);
 				$daten=mysql_fetch_row($markesparteanfrage);
 		 		echo "<td valign=\"top\">&nbsp; / $daten[0] </td>"; 			#nur sparte
  			}
 
Ich würde dir trotzdem empfehlen, das mit Joins zu machen, dann sparst du dir den ganzen überflüssigen Code, und du sparst dir einen Haufen Queries.
 
Ich gebe Dir völlig recht. Werde mich auch damit auseinandersetzen. Mein Problem ist nur, dass ich am Ende der Woche Präsentationstermin habe und noch das ganze Archiv einbauen muss. Somit bin ich erstmal froh, das es klappt. Habe mih noch nie groß mit Joins beschäftigt und denke, dass es mit ein bisserl Ruhe besser geht. Sonst werden es nur halbe Sachen.... Den Code umschreiben, dürfte ja dann nicht mehr das Problem sein -hoffe ich-.

Trotzdem vielen Dank für Deinen Rat!
 
Zurück