MySQL Abfrage
Twilo
- datenbank
0 Daniel_Petratsch0 Twilo0 Ilja0 Twilo0 Daniel_Petratsch0 Ilja
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
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 herauszubekommenden 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
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
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
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
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
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