![]() |
Datenbank: MySQL • Version: 4 • Zugriff über: irrelevant
Problem mit aufeinanderfolgenden OUTER JOINs in MySQL
Hallo!
Ich habe folgendes MySQL-Problem: Ich habe eine Tabelle namens page_series_main, welche eine 1:1 Beziehung zu 5 anderen Tabellen hat. Da nicht in allen dieser 5 Tabellen pro Eintrag eine Beziehung bestehen muss, habe ich mich für OUTER LEFT JOINs entschieden. Jedoch habe ich da noch ein kleines Problem. Hier mal meine Abfrage:
SQL-Code:
Angenommen in page_manga_pages gibt es keinen zugehörigen Eintrag, dann läuft alles so wie es soll. Wenn es jedoch z. B. in page_epiguide_pages keinen zugehörigen Eintrag gibt, gibt es ein Problem und zwar werden dann weder page_opening_pages, page_opening_pages, page_syncspeaker_pages noch page_manga_pages auf einträge geprüft ("geJOINt"). Es erscheint mir logisch wieso das so ist (liegt ja klarerweise am LEFT JOIN), aber wie kann ich das unterbinden?
SELECT sm.serie_id AS id, serie_title AS title, serie_image AS image, count(cp.serie_id) AS charguide,
serie_author AS author, serie_author_gender AS author_gender, count(sp.serie_id ) AS story, count(ep.serie_id) AS epiguide, count(op.serie_id) AS opening, count(ssp.serie_id) AS syncspeaker, count(mp.serie_id) AS manga FROM page_series_main sm NATURAL LEFT OUTER JOIN page_charguide_items cp NATURAL LEFT OUTER JOIN page_story_pages sp NATURAL LEFT OUTER JOIN page_epiguide_pages ep NATURAL LEFT OUTER JOIN page_opening_pages op NATURAL LEFT OUTER JOIN page_syncspeaker_pages ssp NATURAL LEFT OUTER JOIN page_manga_pages mp WHERE sm.serie_id = 1 AND serie_visible != 0 GROUP BY sm.serie_id LIMIT 1; Habe schon an einen FULL OUTER JOIN gedacht (heißt nicht, dass dieser das erzielt was ich will, wäre lediglich ein Versuch gewesen), aber den gibt es in MySQL leider nicht. :cry: Wäre für jeden Tipp froh. ;) Grüße Faux |
Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL
Was spricht gegen normale LEFT JOINs?
SQL-Code:
Gruss
SELECT sm.serie_id AS id,
serie_title AS title, serie_image AS image, COUNT(cp.serie_id) AS charguide, serie_author AS author, serie_author_gender AS author_gender, COUNT(sp.serie_id) AS story, COUNT(ep.serie_id) AS epiguide, COUNT(op.serie_id) AS opening, COUNT(ssp.serie_id) AS syncspeaker, COUNT(mp.serie_id) AS manga FROM page_series_main sm LEFT JOIN page_charguide_items cp ON sm.serie_id = cp.serie_id LEFT JOIN page_story_pages sp ON sm.serie_id = sp.serie_id LEFT JOIN page_epiguide_pages ep ON sm.serie_id = ep.serie_id LEFT JOIN page_opening_pages op ON sm.serie_id = op.serie_id LEFT JOIN page_syncspeaker_pages ssp ON sm.serie_id = ssp.serie_id LEFT JOIN page_manga_pages mp ON sm.serie_id = mp.serie_id WHERE sm.serie_id = 1 AND serie_visible != 0 GROUP BY sm.serie_id LIMIT 1; Thorsten |
Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL
Hallo!
Danke für deine Antwort, aber leider geht es so auch nicht. :cry: NACHTRAG: Habs gelöst, weiß aber leider nicht genau wieso. Ich glaube es liegt am NATURAL JOIN:
SQL-Code:
Also ich dachte der NATURAL JOIN verknüpft einfach alle in beiden Tabellen vorkommenden Felder, oder?! Dann ist das was ich jetzt geschrieben habe, doch genau das Selbe, oder?!
SELECT sm.serie_id AS id, serie_title AS title, serie_image AS image, count(ci.serie_id) AS charguide,
sm.author_id AS author, author_gender AS author_gender, count(sp.serie_id) AS story, count(ep.serie_id) AS epiguide, count(oi.serie_id) AS opening, count(ssp.serie_id) AS syncspeaker, count(di.serie_id) AS dvd, count(mp.serie_id) AS manga FROM page_series_main sm LEFT OUTER JOIN page_author_pages ap ON (sm.author_id = ap.author_id AND author_visible != 0) LEFT OUTER JOIN page_charguide_items ci ON (sm.serie_id = ci.serie_id AND charguide_visible != 0) LEFT OUTER JOIN page_story_pages sp ON (sm.serie_id = sp.serie_id AND story_visible != 0) LEFT OUTER JOIN page_epiguide_pages ep ON (sm.serie_id = ep.serie_id AND epiguide_visible != 0) LEFT OUTER JOIN page_opening_items oi ON (sm.serie_id = oi.serie_id AND opening_visible != 0) LEFT OUTER JOIN page_syncspeaker_pages ssp ON (sm.serie_id = ssp.serie_id AND syncspeaker_visible != 0) LEFT OUTER JOIN page_dvd_items di ON (sm.serie_id = di.serie_id AND dvd_visible != 0) LEFT OUTER JOIN page_manga_pages mp ON (sm.serie_id = mp.serie_id AND manga_visible != 0) WHERE sm.serie_id = 1 AND serie_visible != 0 GROUP BY sm.serie_id LIMIT 1 Grüße Faux |
Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL
Hallo Faux,
dein SELECT liefert 12 Attribute, davon fünf nicht aggregierte - in deiner GROUP BY Klausel steht aber nur eines. Außerdem ist da ein gewaltiger Unterschied zu deinem ersten Versuch, denn dort ist die Referenztabelle immer die "linke", während sie in deinem "funktionierenden" SELECT immer die selbe (SM) ist und du eine zusätzliche JOIN-Bedingung eingeführt hast. Da es sich bei deinen 1:1 Beziehungen um Gen-Spec Relationen handelt ist der OUTER JOIN genau richtig. Grüße vom marabu |
Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL
Hallo!
Danke für die ANtworten, jetzt funktionierts perfekt. Zitat:
Grüße Faux |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz