AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Problem mit aufeinanderfolgenden OUTER JOINs in MySQL

Problem mit aufeinanderfolgenden OUTER JOINs in MySQL

Ein Thema von faux · begonnen am 11. Jun 2006 · letzter Beitrag vom 11. Jun 2006
Antwort Antwort
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#1

Problem mit aufeinanderfolgenden OUTER JOINs in MySQL

  Alt 11. Jun 2006, 01:15
Datenbank: MySQL • Version: 4 • Zugriff über: irrelevant
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.

Wäre für jeden Tipp froh.
Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL

  Alt 11. Jun 2006, 02:06
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
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL

  Alt 11. Jun 2006, 03:45
Hallo!

Danke für deine Antwort, aber leider geht es so auch nicht.

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
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL

  Alt 11. Jun 2006, 10:07
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
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Problem mit aufeinanderfolgenden OUTER JOINs in MySQL

  Alt 11. Jun 2006, 13:03
Hallo!

Danke für die ANtworten, jetzt funktionierts perfekt.
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
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 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