2010-09-14 15 views
73

Ich habe drei TabellenJoining drei Tabellen mit MySQL

genannt
**Student Table** 
------------- 
id name 
------------- 
1  ali 
2  ahmed 
3  john 
4  king 

**Course Table** 
------------- 
id name 
------------- 
1  physic 
2  maths 
3  computer 
4  chemistry 

**Bridge** 
------------- 
sid cid 
------------- 
1  1 
1  2 
1  3 
1  4 
2  1 
2  2 
3  3 
3  4 
4  1 
4  2 

nun die Studentennamen mit dem Kursnamen zu zeigen, die er wie studiert hatte,

**Result** 
--------------------------- 
Student  Course 
--------------------------- 
ahmed   physic 
ahmed   maths 
ahmed   computer 
ahmed   chemistry 
ali   physic 
ali   maths 
john   computer 
john   chemistry 
king   physic 
king   maths 

Ich baue folgende Abfrage

select s.name as Student, c.name as Course from student s, course c join bridge b on c.id = b.cid order by s.name 

Aber es liefert nicht das erforderliche Ergebnis ...

Und was wäre für normalisierte Form sein, wenn ich die Manager über andere finden wollen:

**employee** 
------------------- 
id  name 
------------------- 
1   ali 
2   king 
3   mak 
4   sam 
5   jon 

**manage** 
-------------- 
mid  eid 
-------------- 
1   2 
1   3 
3   4 
4   5 

und will dieses Ergebnis erhalten:

**result** 
-------------------- 
Manager  Staff 
-------------------- 
ali   king 
ali   mak 
mak   sam 
sam   jon 
+0

im ersten Ergebnis, das Sie falsch Daten für ahmed und ali – NineCattoRules

Antwort

105

einfach verwenden:

select s.name "Student", c.name "Course" 
from student s, bridge b, course c 
where b.sid = s.sid and b.cid = c.cid 
+0

Siehe http://stackoverflow.com/questions/13476029/multiple-table-select-vs-join-performance – 10basetom

141

ANSI-Syntax, und es wird ein viel mehr deutlich, wie die Tabellen beitreten:

SELECT s.name as Student, c.name as Course 
FROM student s 
    INNER JOIN bridge b ON s.id = b.sid 
    INNER JOIN course c ON b.cid = c.id 
ORDER BY s.name 
+5

@Muhammad gesetzt: Unsere Antworten sind die gleichen, sie unterscheiden sich nur in der Syntax. Wenn Ihnen die ANSI-Syntax nicht bekannt ist, lohnt es sich, sie zu lernen. Es wird Ihnen helfen, 'JOIN' Fehler zu vermeiden, die Sie in der Zukunft gemacht haben. – RedFilter

+0

Danke funktioniert für mich. :) –

+0

Danke funktioniert für mich –

14

Für normalisieren Form

select e1.name as 'Manager', e2.name as 'Staff' 
from employee e1 
left join manage m on m.mid = e1.id 
left join employee e2 on m.eid = e2.id 
1

verwenden:

SELECT s.name AS Student, c.name AS Course 
FROM student s 
    LEFT JOIN (bridge b CROSS JOIN course c) 
    ON (s.id = b.sid AND b.cid = c.id); 
+0

Diese Antwort fügt nichts Neues zu dieser Frage hinzu und verwendet seltsame (wenn nicht einfach falsche Syntax , Würde mich wundern, wenn dies auch in MySQL gültig wäre). – AeroX

+0

Ich stimme mit AeroX nicht überein. Ansi-Joinsyntax soll Probleme mit dem Old-School-Komma/Wo Join-Syntax zu disambiguieren. Ich schaue, um zu sehen, ob MySql Ansi Joinsyntax spezifisch unterstützt. –

4
SELECT * 
FROM user u 
JOIN user_clockits uc ON u.user_id=uc.user_id 
JOIN clockits cl ON cl.clockits_id=uc.clockits_id 
WHERE user_id = 158 
3
SELECT 
employees.id, 
CONCAT(employees.f_name," ",employees.l_name) AS 'Full Name', genders.gender_name AS 'Sex', 
depts.dept_name AS 'Team Name', 
pay_grades.pay_grade_name AS 'Band', 
designations.designation_name AS 'Role' 
FROM employees 
LEFT JOIN genders ON employees.gender_id = genders.id 
LEFT JOIN depts ON employees.dept_id = depts.id 
LEFT JOIN pay_grades ON employees.pay_grade_id = pay_grades.id 
LEFT JOIN designations ON employees.designation_id = designations.id 
ORDER BY employees.id; 

Sie können über mehrere Tabellen wie in diesem Beispiel JOIN.

0

Abfrage mehr als zwei Tabellen verknüpfen:

SELECT ops.field_id, ops.option_id, ops.label 
FROM engine4_user_fields_maps AS map 
JOIN engine4_user_fields_meta AS meta ON map.`child_id` = meta.field_id 
JOIN engine4_user_fields_options AS ops ON map.child_id = ops.field_id 
WHERE map.option_id =39 AND meta.type LIKE 'outcomeresult' LIMIT 0 , 30 
0
   select tb1.knames, 
       tb3.*, 
       tb2.* 
       from tb3 join tb1 
       on tb3.nid=tb1.nid 
       join tb2 on 
       tb3.id=tb2.id