Zwei Tabellen wechseln
am 01.08.2006 15:13:41 von letters
Hallo,
ich habe ein Problem, bei dem ich gar nicht so richtig weis, wie ich es
beschreiben soll. Ich versuchs einfach mal.
Also, ich habe eine Datenbank mit mehreren Tabellen. Die Haupttabelle
enthält die Id´s der referenzierten Tabellen. In der Haupttabelle gibt es
eine ID_images und eine ID_press (Namen müssen so sein). Nun ist entweder
eine ID_images vorhanden, dann ist ID_press 0 oder es ist eine ID_press
vorhanden, dann ist ID_images 0.
Da eine Datensatz, der z.B. eine ID_images 0 enthält in der Tabelle images
kein Gegenstück findet, gibt mir mysql da nichts aus.
Ich muß bei meiner Abfrage also im SELECT bereits danach unterscheiden.
Wenn eine ID_images größer als 0 da ist, dann soll die Tabelle images mit
abgefragt werden, die Tabelle press aber nicht. Ist eine ID_press größer 0
vorhanden, dann soll die Tabelle press abgefragt werden, die Tabelle images
aber nicht.
Ich hoffe, ich konnte mich verständlich genug ausdrücken.
Wie bekomme ich das in meinen JOIN?
Bisher ist der Versuch so:
SELECT bi.ID_basic, la.land, i.cover_bild1_thumb, bi.release, bi.date,
re.ref1, re.ref2, re.ref3, re.ref4
FROM
basic_informations AS bi
INNER JOIN images AS i ON bi.id_images = i.id_image
INNER JOIN land AS la ON la.ID_land = bi.ID_land
INNER JOIN reference_nb AS re ON re.ID_basic = bi.ID_basic
WHERE bi.id_hg = $data[2]
ORDER BY bi.date, la.land, re.ref1, re.ref2, re.ref3, re.ref4
Damit habe ich aber nur die ID_image abgefragt, die ID_press ist noch
aussen vor.
Mathias
Re: Zwei Tabellen wechseln
am 01.08.2006 16:08:38 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Zwei Tabellen wechseln
am 01.08.2006 16:27:48 von Christian Kirsch
Andreas Kretschmer schrieb:
> begin Mathias Fiedler wrote:
>> Also, ich habe eine Datenbank mit mehreren Tabellen. Die Haupttabelle
>> enthält die Id´s der referenzierten Tabellen.
OT: http://www.sueddeutsche.de/,trt1m1/panorama/artikel/790/8170 9/
Re: Zwei Tabellen wechseln
am 01.08.2006 17:46:49 von letters
Am Tue, 1 Aug 2006 16:08:38 +0200 schrieb Andreas Kretschmer:
> begin Mathias Fiedler wrote:
>> Also, ich habe eine Datenbank mit mehreren Tabellen. Die Haupttabelle
>> enthält die Id´s der referenzierten Tabellen. In der Haupttabelle gibt es
>> eine ID_images und eine ID_press (Namen müssen so sein). Nun ist entweder
>> eine ID_images vorhanden, dann ist ID_press 0 oder es ist eine ID_press
>> vorhanden, dann ist ID_images 0.
>> Da eine Datensatz, der z.B. eine ID_images 0 enthält in der Tabelle images
>> kein Gegenstück findet, gibt mir mysql da nichts aus.
>
> Depends. NULL ist auch was.
weiss ich
>
>> Ich muß bei meiner Abfrage also im SELECT bereits danach unterscheiden.
>> Wenn eine ID_images größer als 0 da ist, dann soll die Tabelle images mit
>> abgefragt werden, die Tabelle press aber nicht. Ist eine ID_press größer 0
>> vorhanden, dann soll die Tabelle press abgefragt werden, die Tabelle images
>> aber nicht.
>
> Die Doku findest Du sicher selber, dort suchst Du nach OUTER JOIN.
>
Outer JOIN hatte ich schon. Leider klappt das nicht so ganz. Es ist so, das
in MySql die Zählung des Auto Inkrement jeder Tabelle mit 1 beginnt. Wenn
ich nun ein Feld ID_press habe und dieses als Auto Inikrement belege,
beginnt die Zählung mit 1. In der Tabelle, die die Indexe enthält, gibt es
nun ein Spalte ID_image und eine Spalte ID_press. Habe ich ein Bild, ist
die ID_press 0, habe ich eine Pressemutteilung, ist die ID_image 0. Nun
brauche ich halt alle Datenbankeinträge mit einer ID_image und alle mit
einer ID_press.
Hier mein Versuch mit dem OUTER JOIN:
SELECT bi.ID_basic, la.land, i.cover_bild1_thumb, bi.release, bi.date,
bi.name, bi.ID_press, pr.bild1_thumb, re.ref1, re.ref2, re.ref3, re.ref4
FROM basic_informations AS bi RIGHT OUTER JOIN images AS i ON bi.ID_images
= i.ID_image RIGHT OUTER JOIN presskit AS pr ON bi.ID_press = pr.ID_press
INNER JOIN land AS la ON la.ID_land = bi.ID_land INNER JOIN reference_nb AS
re ON re.ID_basic = bi.ID_basic WHERE bi.id_hg = 1 ORDER BY bi.date,
bi.name, la.land, re.ref1, re.ref2, re.ref3, re.ref4
Diese Variante bringt überhaupt keine Ausgabe. Mit einem LEFT OUTER JOIN
bekomme ich zwar eine Ausgabe, aber auch nicht vollständig. Ich habe zum
testen 300 Datensätze, die ich ja eigentlich alle augegeben bekommen müßte.
Ist aber nicht der Fall.
Da ich aber doch eigentlich die Datensaätze mit der Ünbereinstimmung rechts
brauche, sollte doch ein RIGHT OUTER JOIN stimmen oder?
Alle Datensätze aus image, deren ID mit basic_informations passen und alle
Datensätze aus presskit, die mit basic_informations passen, sollten doch
wieder alle Datensätze der DB sein, oder sehe ich das falsch?
Mathias
Re: Zwei Tabellen wechseln
am 01.08.2006 17:58:35 von letters
Am Tue, 01 Aug 2006 16:27:48 +0200 schrieb Christian Kirsch:
> Andreas Kretschmer schrieb:
>> begin Mathias Fiedler wrote:
>>> Also, ich habe eine Datenbank mit mehreren Tabellen. Die Haupttabelle
>>> enthält die Id´s der referenzierten Tabellen.
>
> OT: http://www.sueddeutsche.de/,trt1m1/panorama/artikel/790/8170 9/
Was bitte soll das?
Mathias
Re: Zwei Tabellen wechseln
am 01.08.2006 18:32:57 von Thomas Rachel
Mathias Fiedler wrote:
>>>> Id´s
>>
>> OT: http://www.sueddeutsche.de/,trt1m1/panorama/artikel/790/8170 9/
>
> Was bitte soll das?
HaÃ't Du es denn gelese`n?
Thomas
--
Vor Ihnen steht ein Mann, der es gewöhnt ist, drei Zentner
schwere Weiber in SchuhgröÃe 6 zu wuchten! (Al Bundy)
Re: Zwei Tabellen wechseln
am 01.08.2006 18:40:15 von Thomas Rachel
Mathias Fiedler wrote:
> Hier mein Versuch mit dem OUTER JOIN:
>
> SELECT bi.ID_basic, la.land, i.cover_bild1_thumb, bi.release, bi.date,
> bi.name, bi.ID_press, pr.bild1_thumb, re.ref1, re.ref2, re.ref3, re.ref4
> FROM basic_informations AS bi RIGHT OUTER JOIN images AS i ON bi.ID_images
> = i.ID_image RIGHT OUTER JOIN presskit AS pr ON bi.ID_press = pr.ID_press
> INNER JOIN land AS la ON la.ID_land = bi.ID_land INNER JOIN reference_nb
> AS re ON re.ID_basic = bi.ID_basic WHERE bi.id_hg = 1 ORDER BY bi.date,
> bi.name, la.land, re.ref1, re.ref2, re.ref3, re.ref4
d.h. die bi enthält mal eine 0, dann soll anstelle der images bzw. der press
NULL-Werte ausgegeben werden.
Dann ist RIGHT JOIN falschrum (das wäre genau umgekehrt), sondern LEFT JOIN
das Mittel Deiner Wahl.
> Diese Variante bringt überhaupt keine Ausgabe.
Klar.
> Mit einem LEFT OUTER JOIN bekomme ich zwar eine Ausgabe, aber auch nicht
> vollständig. Ich habe zum testen 300 Datensätze, die ich ja eigentlich
> alle augegeben bekommen müÃte.
Kann es vielleicht sein, daà die an irgendeiner anderen JOIN- oder
WHERE-Bedingung rausfallen?
> Da ich aber doch eigentlich die Datensaätze mit der Ãnbereinstimmung
> rechts brauche, sollte doch ein RIGHT OUTER JOIN stimmen oder?
Nein. LEFT/RIGHT gibt an, wo die Tabelle steht, deren Informationen den
"Stamm" darstellen; die andere Seite wird dann quasi "drangeflanscht" bzw.
bei Nichtvorhandensein ausgeNULLt.
> Alle Datensätze aus image, deren ID mit basic_informations passen und alle
> Datensätze aus presskit, die mit basic_informations passen, sollten doch
> wieder alle Datensätze der DB sein, oder sehe ich das falsch?
Wenn Du sonst keine Einschränkungen machst, ja.
Ich vermute, daà es an einem von
la.ID_land = bi.ID_land
re.ID_basic = bi.ID_basic
bi.id_hg = 1
scheitert.
Thomas
--
Murphy's Gesetz ist nicht umkehrbar. Das Auto zu waschen, damit es
regnet, funktioniert nicht.
Re: Zwei Tabellen wechseln
am 01.08.2006 19:12:35 von Axel Schwenke
Mathias Fiedler wrote:
>
> Also, ich habe eine Datenbank mit mehreren Tabellen. Die Haupttabelle
> enthält die Id´s der referenzierten Tabellen. In der Haupttabelle gibt es
> eine ID_images und eine ID_press (Namen müssen so sein). Nun ist entweder
> eine ID_images vorhanden, dann ist ID_press 0 oder es ist eine ID_press
> vorhanden, dann ist ID_images 0.
Das Design ist karpott.
> Da eine Datensatz, der z.B. eine ID_images 0 enthält in der Tabelle images
> kein Gegenstück findet, gibt mir mysql da nichts aus.
Dann tu doch ein Dummy mit ID=0 rein.
> Ich muß bei meiner Abfrage also im SELECT bereits danach unterscheiden.
> Wenn eine ID_images größer als 0 da ist, dann soll die Tabelle images mit
> abgefragt werden, die Tabelle press aber nicht. Ist eine ID_press größer 0
> vorhanden, dann soll die Tabelle press abgefragt werden, die Tabelle images
> aber nicht.
Dann mach das doch so. SELECT ... UNION SELECT ... existiert.
Alternativ kannst du auch zwei separate SELECT Statements schreiben.
Da in den abhängigen Tabellen ja wohl unterschiedliche Daten stehen
(warum sonst sind sie getrennt?) ist das ohnehin sinnvoller.
XL
Re: Zwei Tabellen wechseln
am 02.08.2006 20:37:13 von letters
Am Tue, 1 Aug 2006 19:12:35 +0200 schrieb Axel Schwenke:
> Mathias Fiedler wrote:
>>
>> Also, ich habe eine Datenbank mit mehreren Tabellen. Die Haupttabelle
>> enthält die Id´s der referenzierten Tabellen. In der Haupttabelle gibt es
>> eine ID_images und eine ID_press (Namen müssen so sein). Nun ist entweder
>> eine ID_images vorhanden, dann ist ID_press 0 oder es ist eine ID_press
>> vorhanden, dann ist ID_images 0.
>
> Das Design ist karpott.
>
Warum?
Und was hat das mit der Frage zu tun?
Re: Zwei Tabellen wechseln
am 02.08.2006 20:38:13 von letters
Am Tue, 01 Aug 2006 18:40:15 +0200 schrieb Thomas Rachel:
> Mathias Fiedler wrote:
>
>> Hier mein Versuch mit dem OUTER JOIN:
>>
>> SELECT bi.ID_basic, la.land, i.cover_bild1_thumb, bi.release, bi.date,
>> bi.name, bi.ID_press, pr.bild1_thumb, re.ref1, re.ref2, re.ref3, re.ref4
>> FROM basic_informations AS bi RIGHT OUTER JOIN images AS i ON bi.ID_images
>> = i.ID_image RIGHT OUTER JOIN presskit AS pr ON bi.ID_press = pr.ID_press
>> INNER JOIN land AS la ON la.ID_land = bi.ID_land INNER JOIN reference_nb
>> AS re ON re.ID_basic = bi.ID_basic WHERE bi.id_hg = 1 ORDER BY bi.date,
>> bi.name, la.land, re.ref1, re.ref2, re.ref3, re.ref4
>
> d.h. die bi enthält mal eine 0, dann soll anstelle der images bzw. der press
> NULL-Werte ausgegeben werden.
>
> Dann ist RIGHT JOIN falschrum (das wäre genau umgekehrt), sondern LEFT JOIN
> das Mittel Deiner Wahl.
>
>> Diese Variante bringt überhaupt keine Ausgabe.
>
> Klar.
>
>> Mit einem LEFT OUTER JOIN bekomme ich zwar eine Ausgabe, aber auch nicht
>> vollständig. Ich habe zum testen 300 Datensätze, die ich ja eigentlich
>> alle augegeben bekommen müßte.
>
> Kann es vielleicht sein, daß die an irgendeiner anderen JOIN- oder
> WHERE-Bedingung rausfallen?
>
>> Da ich aber doch eigentlich die Datensaätze mit der Ünbereinstimmung
>> rechts brauche, sollte doch ein RIGHT OUTER JOIN stimmen oder?
>
> Nein. LEFT/RIGHT gibt an, wo die Tabelle steht, deren Informationen den
> "Stamm" darstellen; die andere Seite wird dann quasi "drangeflanscht" bzw.
> bei Nichtvorhandensein ausgeNULLt.
>
Danke, das war hilfreich.
Mathias