2010-09-14 7 views
73

j'ai trois tables nomméesJoining trois tables en utilisant MySQL

**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 

Maintenant, pour afficher le nom de l'étudiant avec le nom du cours qu'il avait étudié comme,

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

Je construis requête suivante

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 

Mais il ne retourne pas le résultat requis ...

Et ce serait pour la forme normalisée, si je veux trouver qui est responsable sur les autres:

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

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

et veut obtenir ce résultat:

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

dans le premier résultat que vous ensemble de données à tort pour ahmed et ali – NineCattoRules

Répondre

105

Utilisez simplement:

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

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

141

syntaxe Utilisez ANSI et il sera beaucoup plus clairement la façon dont vous joindrez les tables:

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: Nos réponses sont les mêmes, ils ne diffèrent que dans la syntaxe. Si vous n'êtes pas au courant de la syntaxe 'ANSI', cela vaut la peine de l'apprendre. Cela vous aidera à éviter les erreurs "JOIN" comme vous l'avez fait dans le futur. – RedFilter

+0

Merci de travailler pour moi. :) –

+0

Merci travaille pour moi –

14

formulaire de Normaliser

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

Utilisez ceci:

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

Cette réponse n'ajoute rien de nouveau à cette question et utilise une syntaxe étrange (si ce n'est pas faux , Je serais surpris si cela était même valable dans MySQL). – AeroX

+0

Je ne suis pas d'accord avec AeroX. La syntaxe de jointure Ansi est destinée à désamorcer les problèmes avec la virgule ancienne/où la syntaxe de jointure. Je cherche à voir si MySql supporte spécifiquement la syntaxe de jointure ansi. –

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; 

Vous pouvez joindre plusieurs tables comme cet exemple ci-dessus.

0

requête pour joindre plus de deux tables:

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