149 votes

Joindre trois tables à l'aide de MySQL

J'ai trois tables nommées

**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 montrer le nom de l'étudiant avec le nom du cours qu'il a é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 la 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 renvoie pas le résultat requis...

Et que serait la forme normalisée, si je veux trouver qui est le manager par rapport aux 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

250voto

RedFilter Points 84190

Utilisez la syntaxe ANSI et la façon dont vous joignez les tableaux sera beaucoup plus claire :

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

170voto

raisyn Points 1038

Il suffit d'utiliser :

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

18voto

PHP Ferrari Points 2769

Pour la forme normalisée

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

5voto

Ali Umair Points 625
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

2voto

Dracula Oppa Points 55

Ne t'inscris pas comme ça. C'est une très mauvaise pratique ! !! Cela ralentira les performances lors de l'extraction de données massives. Par exemple, s'il y a 100 lignes dans chaque table, le serveur de base de données doit récupérer 100x100x100 = 1000000 temps. Il a dû aller chercher pour 1 million temps. Pour surmonter ce problème, joignez les deux premières tables qui peuvent récupérer le résultat avec le minimum de correspondance possible (cela dépend du schéma de votre base de données). Utilisez ce résultat dans une sous-requête, puis joignez-la à la troisième table et récupérez-la. Pour la toute première jointure --> 100x100= 10000 et supposons que nous obtenions 5 résultats correspondants. Et ensuite nous rejoignons la troisième table avec le résultat --> 5x100 = 500. Total des recherches = 10000+500 = 10500 uniquement. Et ainsi, les performances ont augmenté ! !!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X