Lukas.: mysql: Query gesucht

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.

Meine bisherigen JOINS führen nicht zu gewünschtem Ergebnis.

Lukas

  1. 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.

    1. 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

      1. 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

        1. 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.

          1. 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

  2. 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

    1. 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

      1. 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

        1. 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
          • in m ein Eintrag und in f oder a ein/kein (oder auch mehrere) Eintrag ist.

          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

          1. 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

            1. Damit ist RI nicht gegeben.

              Sag ich ja: "Herrje, nein" ;)

        2. 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.

  3. 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.

    1. 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