• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

JOIN über 3 Tabellen

Hallo zusammen,

ich habe 3 Tabellen (Story, Storybilder, Storytexte) die alle mit "Storynummer" verknüpft werden.
Story ist dabei die leitende Tabelle und hat die Kopfdaten es wird aber nur (Storynummer) aus dieser Tabelle verwendet.
Storybilder (Stroynummer, AbsatzNr, widht, heigth, bildurl, bilduntertitel )
Storytexte (Storynummer, AbsatzNr, Absatzart, Absatztext,)

UNION kann ich diesmal nicht verwenden.
Denn in der Whileschleife möchte ich zwar die Möglichkeit haben das Bild in jeden möglichen Absatz zu packen.
Doch da ich weniger Bilder als Absätze habe muss ich in diesen Absätzen dann das Bild auslassen.

Die Schleife Durchlauf also die AbsatzNr der Storynummer und gibt Absatztext und ggf. AbsatzBild aus sofern es eine AbsatzNr gibt.
bsp: AbsatzNr.
Texte 1,2,3,4,5,6,7,8,
Bild 2,5,

Ich wollte erst einmal * verwenden und später erst die jeweiligen Spalten aus den Tabellen.

Ich habe versucht die Beschreibungen zu verstehen die über LEFT JOIN usw im Netz stehen.
Doch irgendwie verstehe ich die ganze Sache nicht so recht.
Das Referenzbuch empfinde ich als recht schwierig zu verstehen.

Mein Code
Code:
SELECT * FROM story  LEFT JOIN (storybilder LEFT JOIN storytexte) USING(Storynummer)
ich hatte zuvor ein Komma statt LEFT JOIN in der Klammer.
Einzig beim USINIG bin ich mir sicher da alle drei Tabellen extra diese Spalte haben um die Verknüpfung einfach zu gestallten.
 
Mmh.

Code:
SELECT *
FROM Story s, Storytexte st
LEFT OUTER JOIN Storybilder sb ON sb.Storynummer = st.Storynummer
WHERE s.Storynummer = st.Storynummer
 
Das hat leider nicht das Ergebnis gebracht das ich suche. Ich habe parallel auch die Artikel bei Selfhtml nochmals gelesen. Und nach dem ich die Einführung gelesen habe bin ich auch sicher das ich ein LEFT JOIN brauche.
Nur mit der Verknüpfung der dritten Tabelle habe ich wohl noch Probleme.

Ich kamm auf folgenden Code.
Code:
 $ergebnis = mysql_query ("SELECT * FROM Story (Storytexte AS st LEFT JOIN storybilder AS sb ON st.Storynummer = sb.Storynummer ) AS s LEFT JOIN Story ON s.Storynummer = st.Storynummer")
  OR die("Error: $abfrage <br>".mysql_error());

$absatzzähler = 1;
while($row = mysql_fetch_object($ergebnis))
{
         echo 'Absatzzähler: ',$absatzzähler;
         echo 'AbsatzSQL: ',$row->AbsatzNr;


         echo'
         <div class="story_text-frank">';
                 if ($row->AbsatzNr == $absatzzähler /*  */ )
                 {
               &nbsp%           {
                echo $row->Absatztext,
                '</div>';
                };
$absatzzähler++;
}; /* While Ende */
?>

doch das ist wohl nicht richtig denn
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(Storytexte AS st LEFT JOIN storybilder AS sb ON st.Storynummer = sb.Storynummer' at line 1

Bei dem Vorgeschlagen Code...
ich stelle durch die folgende Zeilen fest
Code:
         echo 'Absatzzähler: ',$absatzzähler;
         echo 'AbsatzSQL: ',$row->AbsatzNr;

das AbsatzNr. immer mit 2 beginnt. und anschließend mit 5. Das deutet also darauf hin das diese beiden Datensätz aus Storybilder immer wieder durchlaufen werden. Absatzähler endet bei 16 das bedeutet also das die 2 Bilder dafür sogen das die 8 Absatztexte 2 mal durchlaufen werden.

Das wäre ja auch kein Thema. Wenn ich die AbsatzNr von Storybilder bzw Storytexte jeweils mit Absatzzähler vergleichen könnte wie in
Code:
if ($row->AbsatzNr == $absatzzähler)
könnte ich eine Spalte (also das fehlende Bild) überspringen.

Doch auch mit st.AbsatzNr / sb.AbsatzNr oder storytexte.AbsatzNr / storybilder.AbsatzNr. komme ich nicht da ran.
Da habe ich wohl was noch nicht ganz begriffen.


gelöst jede Tabelle hat nun eine eigene Spalte AbsatzNr.
 
Zuletzt bearbeitet:
Verständnissfrage

Mmh.

Code:
SELECT *
FROM Story s, Storytexte st
LEFT OUTER JOIN Storybilder sb ON sb.Storynummer = st.Storynummer
WHERE s.Storynummer = st.Storynummer

Ich habe auch durch meine parallelen Recherchen an dem Select probiert.
Und festgestellt das ich mit
Code:
SELECT * FROM Story s, Storytexte st LEFT JOIN Storybilder sb ON sb.Storynummer = st.Storynummer WHERE s.Storynummer = st.Storynummer AND s.url ='" . mysql_real_escape_string($_GET['SQL']) . "' AND ( Veroeffentlicht_am IS NOT NULL)
Ebenfalls auf 16 Datensätze komme. Und es wohl auch genauso lange dauert. (stellt euch die beiden AND Kriterien oben hinzu)

aber müsste es zwischen LEFT OUTER JOIN und LEFT JOIN nicht einen Unterschied geben?
 
Zurück
Oben