2017-05-15 4 views
1

so habe ich zwei Tabellen.Wie wählt man eine Tabelle und dann eine andere Tabelle mysql

Benutzer

users_id | firstname | lastname 
10001  |  mike  | lapiz 
10002  |  tom  | jerry 

Profil

profile_id | department | specialization 
10001  | Health Dept |  Heart 
10002  | Brain Dept |  Brain 

vielleicht haben Sie re curious why i separate the name of the user and the profile.. i have my on reasons for that.. what i wanted to do is to select my all fields from Profil then join the Benutzer `Tabelle

, was ich ist das Ergebnis sein wollen

users_id | firstname | lastname | profile_id | department |specialization 
10001 | mike  | lapiz | 1001  | health dept | heart 

das ist meine Frage ..

$sql = SELECT a.profile_id,a.department,a.specialization FROM tbl_profile AS a LEFT JOIN (SELECT users_id,firstname,lastname FROM tbl_users ) AS b ON a.profile_id = b.users_id

was nur geschehen, ist es, die Profiltabelle angezeigt werden .. es die Anzeige ist nicht die andere Tabelle .. und wenn ich versuchte zu LEFT JOIN (SELECT b.users_id,b.firstname,b.lastname FROM tbl_users ) AS b

gibt mir einen Fehler unbekannt Spalt b.users_id

+0

Die Tabelle 'profile' benötigt eine Spalte' user_id', die ein Fremdschlüssel ist, der die entsprechende Benutzerzeile in der 'user' Tabelle referenziert. –

+1

@ Aluan Haddad: Das würde eine 1: {0; n} Relation herstellen, während das OP offensichtlich will, dass es 1: {0; 1} ist. So ist 'profile.profile_id' angeblich der Primärschlüssel der Tabelle und ein Fremdschlüssel für' users.user_id', der die Beziehung korrekt aufbaut. –

+0

Danke, jetzt verstehe ich. Ich schätze Ihre Antwort. Bad db design obwohl. –

Antwort

1

sollten Sie innere join verwenden nicht Exklusionsverknüpfung

verschachtelt
$sql = SELECT a.profile_id,a.department,a.specialization,b.users_id,b.firstname, 
      b.lastname FROM tbl_profile AS a inner join tbl_users b 
      ON a.profile_id = b.users_id  
0

Wie Sie sowohl alle Spalten in auflisten möchten die Tabellen mit LEFT OUTER JOIN, wird die folgende Abfrage Ihren Zweck dienen:

SELECT * FROM users LEFT OUTER JOIN profile on users.users_id = profile.profile_id 

Sie kann den Alias ​​auch verwenden, wenn Sie möchten, wie folgt:

SELECT * FROM users u LEFT OUTER JOIN profile p on u.users_id = p.profile_id 
1

Sie missverstehen, wie ein Join funktioniert.

FROM tbl_profile JOIN tbl_users ON ... 

verbindet die beiden Tabellen, d. H. Kombiniert Datensätze zu der gegebenen Bedingung in ON.

FROM tbl_profile JOIN (SELECT * FROM tbl_users) 

tut genau das Gleiche. Es macht keinen Unterschied, ob Sie einer Tabelle direkt beitreten oder die Datensätze der Tabelle verbinden, denn das bedeutet genau das Gleiche.

FROM tbl_profile JOIN (SELECT users_id, firstname, lastname FROM tbl_users) 

wieder die gleiche Sache. Nur dass Sie die Spalten, die Sie in der Abfrage verwenden können, auf die drei angegebenen Spalten beschränken. Wenn also mehr Spalten in der Tabelle vorhanden sind, können Sie sie nicht mehr in der Abfrage-Klausel select oder wo oder order by verwenden.

Also ein Join bedeutet nur Datensätze zu kombinieren. Welche Spalten Sie anzeigen möchten, geben Sie die select-Klausel ein:

SELECT * FROM tbl_profile JOIN tbl_users ON ... 

wählt alle Spalten aus beiden Tabellen aus.

SELECT p.department FROM tbl_profile p JOIN tbl_users u ON ... 

wählt nur die Abteilung aus.

Sie wollen:

SELECT * FROM tbl_users u JOIN tbl_profile p ON p.profile_id = u.user_id 

A LEFT JOIN durch die Art und Weise ist eine äußere Verknüpfung, wo Sie die Datensätze aus der linken Tabelle auch in den Ergebnissen zu halten, wenn es keine Übereinstimmung in der rechten Tabelle ist. In Ihrer Anfrage haben Sie gesagt, dass Sie auch Profildatensätze anzeigen möchten, die keine Übereinstimmung in der Benutzertabelle haben, was sicherlich nicht beabsichtigt war.

Verwandte Themen