Teiger: mySQL SELECT

Guten Tag,

$this->db->select("*", "events AS e, lnk_event_conductor AS lec, contacts AS c, lnk_event_pic AS lep, pictures_events AS pe",                   "(e.lang = '".$this->language."') AND (e.id = '".$id."')AND (e.id = lec.id_event) AND (lec.id_event = c.id)  AND (e.id = lep.id_event) AND (lep.id_event = pe.id)", "", "", "", "");

Wie kann ich es erreichen, dass die Daten auch ausgewählt werden wenn kein Bild vorhanden ist?

Die ANDs sind doch dazu da, damit man mysql mitteilen kann was mit was verknüpft ist, oder nich?

Danke

  1. yo,

    Wie kann ich es erreichen, dass die Daten auch ausgewählt werden wenn kein Bild vorhanden ist?

    indem du anstelle von inner joins outer joins (zum beispiel LEFT JOIN)verwendest. deine abfrage ist in der form aber ein wenig unübersichtlich. schreibe sie mal als reines SQL ohne die objektangaben.

    Die ANDs sind doch dazu da, damit man mysql mitteilen kann was mit was verknüpft ist, oder nich?

    And ist ein logischer Operator, der einzelnen aussagen miteiander verbindet. dau scheinbar mehrere tabellen miteinander verbinden willst, hast du auch mehrere joins die durch AND verbunden werden.

    Ilja

    1. Halo,

      indem du anstelle von inner joins outer joins (zum beispiel LEFT JOIN)verwendest. deine abfrage ist in der form aber ein wenig unübersichtlich. schreibe sie mal als reines SQL ohne die objektangaben.

      Oh, das sagt mir nichts. Könntest Du mir das bitte erklären?

      And ist ein logischer Operator, der einzelnen aussagen miteiander verbindet. dau scheinbar mehrere tabellen miteinander verbinden willst, hast du auch mehrere joins die durch AND verbunden werden.

      SELECT * FROM events AS e, lnk_event_conductor AS lec, contacts AS c,
                    lnk_event_pic AS lep, pictures_events AS pe
                    WHERE (e.lang = '".$this->language."')
                    AND (e.id = '".$id."')
                    AND (e.id = lec.id_event)
                    AND (lec.id_event = c.id)
                    AND (e.id = lep.id_event)
                    AND (lep.id_event = pe.id);

      Das ist ein inner join?

      Wie geht das outer joins? Und was ist das?

      Danke

      1. yo,

        Oh, das sagt mir nichts. Könntest Du mir das bitte erklären?

        der outer join ist für abfragen gedacht, die genau das problem lösen können, das du hast, sprich zeige mir die daten der einen tabelle immer an und wenn vorhanden auch die daten der zweiten tabellen. das ist im groben die aufgaben voun outer joins.

        wenn du nun den outer join bilden willst, musst du dir erst klar sein, welche daten welcher tabelle immer angezeigt werden sollen. sie syntax ist im groben etwa so:

        SELECT spalten
        FROM tabelle1 LEFT JOIN tabelle2 ON (hier_join_kriterium)
        WHERE bedinungen;

        Ilja

        1. Hallo,

          der outer join ist für abfragen gedacht, die genau das problem lösen können, das du hast, sprich zeige mir die daten der einen tabelle immer an und wenn vorhanden auch die daten der zweiten tabellen. das ist im groben die aufgaben voun outer joins.

          Habe mir gerade die mysql Doku durchgelesen und verstanden wozu die Outer join da sind.
          Aber wie die Funktionieren verstehe ich immer noch nicht.
          Habe folgeneds Beispiel gefunden und versucht es zu verstehen.

          Nachtragsbeispiel mit 3 Tabellen:
          http://php-resource.de/forum/showthread.php?s=&threadid=28292

          Der Autor schreibt dazu:
          "bei noch mehr tabellen geht's analog

          mann sollte sich nur überlegen, welche tabelle man wo hinschreibt, hier steht tabelle1 in der mitte, da ich sie zweimal brauche
          hätte ich mittabelle1 angefangen, hätte ich sie zweimal verwenden müssen, was ja nicht unbedingt sein muss"

          Was ist aber in meinem Beispiel. Dort benutze ich 5 Tabellen.
          2 Davon dienen aber nur dazu Daten einer Tabelle der anderen zuzuordnen.

          Es gibt bei mir folgende Tabellen:

          Tabelle 1:events
          -----------------------------
          id|headline|txt

          Tabelle 2:lnk_event_conductor
          ------------------------------
          id_event|id_conductor

          Tabelle3: lnk_event_pic
          ------------------------------
          id_event|id_pic

          Tabelle 4: contacts
          -------------------------------
          id|company|name|email

          Tabelle 5: pictures_events
          -------------------------------
          id|picture|description

          Bemerkung: Es sind immer leute bei den Events aber eben icht immer Bilder vorhanden.

          Könntest Du mir freundlicherweise die Lösung geben,so dass ich diese studieren kann? Das würde echt helfen.

          Hier noch mal das Statement:

          SELECT * events AS e,
                   lnk_event_conductor AS lec,
                   contacts AS c,
                   lnk_event_pic AS lep,
                   pictures_events AS pe
             FROM (e.lang = '".$this->language."')
              AND (e.id = '".$id."')
              AND (e.id = lec.id_event)
              AND (lec.id_event = c.id)
              AND (e.id = lep.id_event) AND (lep.id_event = pe.id);

          1000fach Dank.

          Gruß Teiger

          1. yo,

            so bin zuhause angekommen, feierabend allerdings kein bier im kühlschrank.

            Aber wie die Funktionieren verstehe ich immer noch nicht.

            das geht fast allen so, an den outer joins muss man sich erst einmal gewöhnen.

            hätte ich mittabelle1 angefangen, hätte ich sie zweimal verwenden müssen, was ja nicht unbedingt sein muss"

            ich vermute mal, dein gedankenproblem ist, dass du immer nur outer joins für alle tabellen verwdenden willst. man kann die joins aber auch untereinander "vermischen", je nachdem wie zwei tabellen miteinander verbunden werden sollen.

            Dort benutze ich 5 Tabellen.
            2 Davon dienen aber nur dazu Daten einer Tabelle der anderen zuzuordnen.

            wenn dort immer zu einem eintrag auch der jeweilige passende andere eintrag steht, dann nimmmst du sie als inner joins rein. lass mich das prinzip noch mal erklären.

            wenn du in der einen tabelle die mitarbeiter gespeichert hast und du wissen willst, ob sie kinder haben und wenn ja, welche das sind, dann brauchst du einen outer join dafür, weil ja nicht jeder mitarbeiter kinder haben muss, du ihn aber trotzdem mit auflisten willst. sprich zeige mir alle datensätze der mitarbeiter und wenn vorhanden ihre kinder.

            wenn du nun aber noch die abteilung wissen willst, die ein mitarbeiter arbeitet, macht man das in aller regel mit einem inner join, weil jeder mitarbeiter ja in einer abteilung arbeitet. und beides kann man in einer abfrage miteinander kombinieren.

            auf dein beispiel angewandz heisst das, du musst nur dort outer joins einsetzten, wo nicht zwingend ein oder mehrere gegenparts vorhanden sein müssen.

            also events ist der ausgangspunkt.

            SELECT spalten
            FROM events e
            WHERE e.lang = 'Englisch'
            AND e.id = 'id_nummer';

            so und nun ist die frage, in welchen tabelen gibt es immer einen gegenpart. ich vermute einfach mal und denke wir können die companys mit inner join mit reinnehmen.

            SELECT spalten
            FROM events e,lnk_event_conductor AS lec, contacts AS c
            WHERE e.lang = 'Englisch'
            AND e.id = 'id_nummer'
            AND e.id = lec.id_event
            AND lec.id_event = c.id;

            ok, nun kommen wohl die outer joins ins spiel. mal von deinem design fehle der tabellen abgeshen, da es sich meiner meinung nach um eine 1:n beziehung habdelt und nicht um eine n:m, könnte man sich auch eine tabelle sparen. es sei den, dass nicht nur ein event mehrere bilder haben kann, sondern ein bild auch zu mehreren events gehören kann. dann will ich nichts gesagt haben.

            SELECT spalten
            FROM lnk_event_conductor AS lec, contacts AS c, events e
            LEFT JOIN lnk_event_pic AS lep ON (e.id = lep.id_event)
            LEFT JOIN pictures_events AS pe ON (lep.id_event = pe.id)
            WHERE e.lang = 'Englisch'
            AND e.id = 'id_nummer'
            AND e.id = lec.id_event
            AND lec.id_event = c.id;

            e viola

            Ilja