Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Problem mit aufeinanderfolgenden OUTER JOINs in MySQL (https://www.delphipraxis.net/71210-problem-mit-aufeinanderfolgenden-outer-joins-mysql.html)

faux 11. Jun 2006 00:15

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:
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;
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?
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

omata 11. Jun 2006 01:06

Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL
 
Was spricht gegen normale LEFT JOINs?

SQL-Code:
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;
Gruss
Thorsten

faux 11. Jun 2006 02:45

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:
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
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?!

Grüße
Faux

marabu 11. Jun 2006 09:07

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

faux 11. Jun 2006 12:03

Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL
 
Hallo!

Danke für die ANtworten, jetzt funktionierts perfekt.
Zitat:

Zitat von marabu
Da es sich bei deinen 1:1 Beziehungen um Gen-Spec Relationen handelt ist der OUTER JOIN genau richtig.

Naja, nicht immer. Es gibt auch 1:m und m:n Beziehungen.

Grüße
Faux


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz