Twilo: MySQL Abfrage

Hallo,

ich seh gerade den Wald vor lauter Bäume nicht :-(

ich möchte aus einer Tabelle die UserID abfragen um danach aus einer anderen Tabelle die eMail-Adresse von der UserID herauszubekommen

also
Tabelle1     Tabelle2
+----------+----------+
| _id      | _id      |
| _user_id | _email   |
| ...      | ...      |
+----------+----------+

die _id aus der ersten ID habe ich
ich muss also aus der Tabelle1 die _user_id abfragen
um danach aus Tabelle2 die eMail-Adresse herauszubekommen

den Umweg über eine extra PHP Abfrage möchte ich mir eigentlich ersparen

so schwer kann das doch nicht sein, oder? *schäm*

mfg
Twilo

  1. Hallo Twilo

    ich seh gerade den Wald vor lauter Bäume nicht :-(

    ich möchte aus einer Tabelle die UserID abfragen um danach aus einer anderen Tabelle die eMail-Adresse von der UserID herauszubekommen

    also
    Tabelle1     Tabelle2
    +----------+----------+
    | _id      | _id      |
    | _user_id | _email   |
    | ...      | ...      |
    +----------+----------+

    die _id aus der ersten ID habe ich
    ich muss also aus der Tabelle1 die _user_id abfragen
    um danach aus Tabelle2 die eMail-Adresse herauszubekommen

    den Umweg über eine extra PHP Abfrage möchte ich mir eigentlich ersparen

    Du kannst ja mittels MySql einen INNER JOIN durchführen, dass heisst Mysql erweitert alle Datensätze aus Tabelle 1 mit einem Datensatz aus Tabelle 2 über einen Schlüssel. Dazu spezifizierst du einfach einen sogenannten Schlüssel, über diesen die Tabellen verbunden werden, in deinem Fall ist das "_id".

    In Mysql sieht das dann folgendermassen aus:

    SELECT a._user_id, b._email
    FROM Tabelle1 AS a
    INNER JOIN Tabelle2 AS b
    ON(a._user_id = b._user_id)
    WHERE a._id = xx;

    Somit bekommst du dann deine gewünschte Email Adresse heraus.
    Aufpassen musst du nur, falls in der 2. Tabelle kein Datensatz mit der _id aus der ersten existiert, somit wird dieser Datensatz dann überhaupt nicht ausgegeben.

    freundliche Grüße,
    Daniel Petratsch

    1. Hallo,

      In Mysql sieht das dann folgendermassen aus:

      SELECT a._user_id, b._email
      FROM Tabelle1 AS a
      INNER JOIN Tabelle2 AS b
      ON(a._user_id = b._user_id)
      WHERE a._id = xx;

      danke für deine Antwort

      ich hab es eben auch so hinbekommen

      SELECT tabelle1._email
      FROM tabelle1, tabelle2
      WHERE tabelle1._id = tabelle2._user_id
      AND tabelle2._id = 8

      welche Lösung ist jetzt besser bzw. von der Performance besser?

      mfg
      Twilo

      1. yo,

        welche Lösung ist jetzt besser bzw. von der Performance besser?

        beide sind gleichwertig, halt nur eine andere schreibweise. allerdings hat die reihenfolge der tabellen und bedingungen manchmal eine nicht unerhebliche auswirkung auf die ausführung. welche reihenfolge nun welche wirkung hat, hängt auch immer ein wenig mit dem dbms und der version zu tun. ich würde mir aber bei nicht all zu grossen datenbeständen keinen kopf darüber machen.

        der anderen hinweis ist da schon interessanter, dass nicht jeder user eine e-mail besitzt (hängt vom datenbank-design ab). insofern solltst du vielleicht einen OUTER JOIN und keinen INNER JOIN verwenden.

        Ilja

        1. Hallo,

          welche Lösung ist jetzt besser bzw. von der Performance besser?

          beide sind gleichwertig, halt nur eine andere schreibweise. allerdings hat die reihenfolge der tabellen und bedingungen manchmal eine nicht unerhebliche auswirkung auf die ausführung. welche reihenfolge nun welche wirkung hat, hängt auch immer ein wenig mit dem dbms und der version zu tun. ich würde mir aber bei nicht all zu grossen datenbeständen keinen kopf darüber machen.

          der anderen hinweis ist da schon interessanter, dass nicht jeder user eine e-mail besitzt (hängt vom datenbank-design ab). insofern solltst du vielleicht einen OUTER JOIN und keinen INNER JOIN verwenden.

          das Feld "_email" hat auf jedenfall ein Wert, ohne eine eMail-Adresse, kann sich kein User registrieren
          dann sollte doch kein Problem auftreten, oder?

          oder meintet ihr etwas anderes?

          mfg
          Twilo

          1. Hallo Twilo!

            das Feld "_email" hat auf jedenfall ein Wert, ohne eine eMail-Adresse, kann sich kein User registrieren
            dann sollte doch kein Problem auftreten, oder?

            oder meintet ihr etwas anderes?

            Der Hinweis von Ilja war schon korrekt, denn der INNER JOIN gibt den Datensatz nur zurück insofern in der gejoineten (oder wie man das auch immer schreibt :) ) Tabelle auch ein Datensatz mit dem gleichen Schlüssel existiert. Konkret: Hat du in Tabelle 1 einen Datensatz mit dem Key "id=5" und in der Tabelle 2 keinen Datensatz mit der "id=5", so bekommst du diesen Datensatz überhaupt nicht ausgegeben. Existiert aber so ein Datensatz (wichtig ist, er muss nur existent sein, ob in deinem Email Feld etwas eingetragen ist oder nicht ist egal) so wird er auch ausgegeben.

            Den LEFT JOIN benötigst Du genau dann wenn du den Datensatz trotzdem ausgegeben bekommen möchtest (obwohl kein Pendant in der 2. Tabelle existiert).
            D.h. an der Stelle der auszugebenden Felder in Tabelle 2 wird dann einfach ein NULL ausgegeben, somit ist dann ersichtlich dass dieser Datensatz nicht existiert, oder falls existent noch kein Wert eingetragen war.

            Probiers einfach im PHPMYADMIN aus, dann verstehst du das gleich einmal.

            freundliche Grüße,
            Daniel Petratsch

          2. yo,

            das Feld "_email" hat auf jedenfall ein Wert, ohne eine eMail-Adresse, kann sich kein User registrieren
            dann sollte doch kein Problem auftreten, oder?

            es geht weniger darum, ob das feld email einen wert hat, sondern ob jeder user auch einen entsprechenden datensatz in der zweiten tabelle besitzt. aber so wie du es schreibst, scheint genau das der fall zu sein und dann sollte auch der INNER JOIN seine zwecke erfüllen.

            auf der anderen seite kommt dann wieder das datenbank-design zur sprache und ob man da nicht ein wenig verbessern kann. gefühle täuschen, aber handelt es sich bei den beiden tabellen nicht um eine 1:1 beziehung ?

            Ilja