Uniendo tres tablas usando MySQL

117

Tengo tres tablas nombradas

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

Ahora para mostrar el nombre del estudiante con el nombre del curso que había estudiado,

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

Construyo la siguiente consulta

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

Pero no devuelve el resultado requerido ...

Y lo que sería para la forma normalizada, si quiero encontrar quién es gerente sobre otro:

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

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

Y quiere obtener este resultado:

**result**
--------------------
Manager      Staff
--------------------
ali          king
ali          mak
mak          sam
sam          jon
PHP Ferrari
fuente
en el primer resultado, configuró datos incorrectamente para ahmed y ali
NineCattoRules

Respuestas:

199

Use la sintaxis ANSI y será mucho más claro cómo se une a las tablas:

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 
RedFilter
fuente
9
@Muhammad: Nuestras respuestas son las mismas, solo difieren en la sintaxis. Si no conoce la ANSIsintaxis, vale la pena aprenderla. Le ayudará a evitar JOINerrores como los que haya cometido en el futuro.
RedFilter
16

Para normalizar la forma

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
PHP Ferrari
fuente
¿Importa el orden en m.mid = e1.idy m.eid = e2.id?
Pathros
1
@Pathros No, el orden no importa, en esas expresiones.
ToolmakerSteve
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
Ali Umair
fuente
Esta respuesta es muy similar a las respuestas ya dadas 5 años antes. ¿Qué de su respuesta cree que es importante y que falta en las respuestas existentes?
ToolmakerSteve
1
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;

Puede UNIR varias TABLAS como en este ejemplo anterior.

sameerNAT
fuente
Ya hay varias respuestas, de años antes, que muestran "unirse a varias mesas". ¿Qué agrega su respuesta a la discusión?
ToolmakerSteve
0

Consulta para unir más de dos tablas:

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
Manish
fuente
Ya hay varias respuestas, de años antes, que muestran "unirse a varias mesas". ¿Qué agrega su respuesta a la discusión?
ToolmakerSteve
0

Utilizar este:

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);
usuario3477784
fuente
1
Esta respuesta no agrega nada nuevo a esta pregunta y usa una sintaxis extraña (si no es una sintaxis simplemente incorrecta, me sorprendería si esto fuera válido en MySQL).
AeroX
No estoy de acuerdo con AeroX. La sintaxis de unión de Ansi está destinada a eliminar la ambigüedad de los problemas con la sintaxis de unión de la vieja escuela / where. Estoy buscando ver si MySql admite la sintaxis de unión ansi específicamente.
Larry Smith
0

No te unas así. ¡Es una práctica realmente mala! Ralentizará el rendimiento en la obtención de datos masivos. Por ejemplo, si hay 100 filas en cada tabla, el servidor de la base de datos tiene que buscar 100x100x100 = 1000000tiempos. Tuvo que buscar por 1 milliontiempos. Para superar ese problema, únase a las dos primeras tablas que pueden obtener el resultado de la mínima coincidencia posible (depende del esquema de su base de datos). Use ese resultado en Subconsulta y luego únalo con la tercera tabla y recójalo. Para la primera combinación -> 100x100= 10000veces y supongamos que obtenemos 5 resultados coincidentes. Y luego nos unimos a la tercera tabla con el resultado -> 5x100 = 500.Total fetch = 10000+500 = 10200times only. Y así, ¡¡¡la actuación subió !!!

Drácula Oppa
fuente