mysql: Query gesucht
Lukas.
- sql
Hallo,
ich habe ein Problem, was ich über einen JOIN nicht hin bekomme. Ich habe 3 Tabellen:
Ich möchte abfragen, ob es entweder in Tabelle f oder in Tabelle a einen Eintrag zu einer bestimmten M_ID des Wertes "x" gibt.
Meine bisherigen JOINS führen nicht zu gewünschtem Ergebnis.
Lukas
Tach!
Ich möchte abfragen, ob es entweder in Tabelle f oder in Tabelle a einen Eintrag zu einer bestimmten M_ID des Wertes "x" gibt.
Meine bisherigen JOINS führen nicht zu gewünschtem Ergebnis.
Joins sind schön und gut, aber nicht immer das beste Mittel, um auf mehrere Datenmengen zuzugreifen. Du baust damit eine große Datenmenge zusammen, versuchst darin nun anscheinend das gewünschte Ergebnis herauszulesen, bekommst aber aus der großen Menge nicht mehr das passende gefiltert.
In deiner Aufgabenstellung steckt ja schon das Wort EXISTS() drin. Damit sollte das deutlich besser und auch übersichtlicher gehen. Du wirst damit Subquerys verwenden und diese kannst du schön separat und ohne Join formulieren und testen, bevor du sie in die Hauptquery einbaust.
dedlfix.
Hi dedlfix,
In deiner Aufgabenstellung steckt ja schon das Wort EXISTS() drin. Damit sollte das deutlich besser und auch übersichtlicher gehen. Du wirst damit Subquerys verwenden und diese kannst du schön separat und ohne Join formulieren und testen, bevor du sie in die Hauptquery einbaust.
Auja, guter Hinweis, danke. Dann komm ich ab hier sicher klar. Ansonsten meld ich mich nochmal.
Lukas
Hi dedlfix,
In deiner Aufgabenstellung steckt ja schon das Wort EXISTS() drin. Damit sollte das deutlich besser und auch übersichtlicher gehen. Du wirst damit Subquerys verwenden und diese kannst du schön separat und ohne Join formulieren und testen, bevor du sie in die Hauptquery einbaust.
Auja, guter Hinweis, danke. Dann komm ich ab hier sicher klar. Ansonsten meld ich mich nochmal.
Lukas
Hi Dedlfix,
noch besser Lösung, oder?
SELECT
F_ID FROM table_f
WHERE M_ID = 'x'
UNION
SELECT
A_ID FROM table_a
WHERE M_ID = 'x'
Gruß, Lukas
Tach!
noch besser Lösung, oder?
Das kommt drauf an, was dein eigentliches Ziel ist.
SELECT F_ID FROM table_f WHERE M_ID = 'x' UNION SELECT A_ID FROM table_a WHERE M_ID = 'x'
Diese Abfrage gibt alle Datensätze mit dieser ID. Wobei du in der Form nicht unterscheiden kannst, ob sie von f oder a kommen und auch nicht die Anzahl ermitteln kannst. UNION ohne ALL entfernt doppelte Ergebniszeilen. Das betrifft die Fälle, bei denen F_ID und A_ID gleich sind.
Auch ist da das entweder-oder (=XOR) der Fragestellung nicht drin, falls das überhaupt so gemeint war.
Wenn du mit der Abfrage dein Ziel erreichst, dann wüsste ich nicht, was dagegenspräche.
dedlfix.
Hi dedlfix,
Diese Abfrage gibt alle Datensätze mit dieser ID. Wobei du in der Form nicht unterscheiden kannst, ob sie von f oder a kommen und auch nicht die Anzahl ermitteln kannst. UNION ohne ALL entfernt doppelte Ergebniszeilen. Das betrifft die Fälle, bei denen F_ID und A_ID gleich sind.
Auch ist da das entweder-oder (=XOR) der Fragestellung nicht drin, falls das überhaupt so gemeint war.
Wenn du mit der Abfrage dein Ziel erreichst, dann wüsste ich nicht, was dagegenspräche.
Ok, danke für die Erklärung. Als Hinweis, was ich wollte: Es ging mir nur darum, festzustellen, ob entweder in f oder a ein Treffer ist. Ist das der Fall, ist mein Ziel erreicht. Ist die Ergebnismenge leer, ist mein Ziel ebenfalls erreicht. Im Grunde gehts mir nur darum, ob ein Treffer in a oder f vorhanden ist oder n icht, weil als Folge hieraus entweder ein Link generiert wird oder ein feststehender String ohne Anker.
Lukas
Hallo,
ich habe ein Problem, was ich über einen JOIN nicht hin bekomme. Ich habe 3 Tabellen:
Tabelle m: M_ID, usw.
Tabelle f: F_ID, M_ID, usw.
Tabelle a: A_ID, M_ID, usw.
- Die M_ID der Tabellen f und a bezieht sich jeweils auf die M_ID der Tabelle m.
- Zu jedem Eintrag in Tabelle f oder a gibt es immer einen Eintrag in Tabelle m.
Ich möchte abfragen, ob es entweder in Tabelle f oder in Tabelle a einen Eintrag zu einer bestimmten M_ID des Wertes "x" gibt.
Wenn die referentielle Integrität sichergestellt ist wie oben beschrieben, reicht eine Abfrage auf Tabelle a oder eine Abfrage auf Tabelle f.
MfGs
Hallo,
Wenn die referentielle Integrität sichergestellt ist wie oben beschrieben, reicht eine Abfrage auf Tabelle a oder eine Abfrage auf Tabelle f.
Ich verstehe nicht genau, was Du damit meinst.
Gruß, Lukas
Hallo,
Wenn die referentielle Integrität sichergestellt ist wie oben beschrieben, reicht eine Abfrage auf Tabelle a oder eine Abfrage auf Tabelle f.
Ich verstehe nicht genau, was Du damit meinst.
Ok, formulieren wir das mal so: Wenn wir wissen, dass es in m den Eintrag gibt, reicht eine Abfrage auf a um sagen zu können, dass der Eintrag in f sein muss, wenn er nicht in a vorhanden ist.
RI ist aber auch in Wikipedia recht gut beschrieben.
MfGs
Hi PL,
Ok, formulieren wir das mal so: Wenn wir wissen, dass es in m den Eintrag gibt, reicht eine Abfrage auf a um sagen zu können, dass der Eintrag in f sein muss, wenn er nicht in a vorhanden ist.
Herrje, nein. Es kann sein, dass:
Einzig eines kann nicht sein:
Dass in a oder f ein (mehrere) Eintrag(e) ist/sind, aber in m nicht. Das ist in meiner Konstellation unmöglich.
Gruß, Lukas
Hi PL,
Ok, formulieren wir das mal so: Wenn wir wissen, dass es in m den Eintrag gibt, reicht eine Abfrage auf a um sagen zu können, dass der Eintrag in f sein muss, wenn er nicht in a vorhanden ist.
Herrje, nein. Es kann sein, dass:
- in m ein Eintrag und in f und a kein Eintrag ist
Damit ist RI nicht gegeben.
MfG
Damit ist RI nicht gegeben.
Sag ich ja: "Herrje, nein" ;)
Tach!
Wenn die referentielle Integrität sichergestellt ist wie oben beschrieben, reicht eine Abfrage auf Tabelle a oder eine Abfrage auf Tabelle f.
Ok, formulieren wir das mal so: Wenn wir wissen, dass es in m den Eintrag gibt, reicht eine Abfrage auf a um sagen zu können, dass der Eintrag in f sein muss, wenn er nicht in a vorhanden ist.
Nein, die referenzielle Integrität stellt nur sicher, dass die Referenzen gültig sind, also dass in Tabelle f keine M_ID existiert, zu der in m kein Datensatz existiert. Und das dann ebenso für Tabelle a. Darüber kann man nicht festlegen, dass die M_ID nur unique vorkommen darf. Das wäre Aufgabe eines Constraints. Falls das überhaupt in dem Fall gefragt ist. Außerdem geht ein Unique-Constraint auch nur innerhalb einer Tabelle und nicht tabellenübergreifend.
dedlfix.
Lieber Lukas.,
Ich möchte abfragen, ob es entweder in Tabelle f oder in Tabelle a einen Eintrag zu einer bestimmten M_ID des Wertes "x" gibt.
und dann? möchtest Du dann den passenden Eintrag aus Tabelle a oder f haben? Oder geht es Dir nur um eine Prüfung, ob Tabelle m keine verwaisten Einträge mehr hat?
Liebe Grüße,
Felix Riesterer.
Hi Felix,
und dann? möchtest Du dann den passenden Eintrag aus Tabelle a oder f haben? Oder geht es Dir nur um eine Prüfung, ob Tabelle m keine verwaisten Einträge mehr hat?
Ich habs hier versucht, nochmal zu beschreiben:
https://forum.selfhtml.org/self/2017/jan/22/mysql-query-gesucht/1684950#m1684950
Gruß, Lukas