2010-09-14 27 views
73

yo tenemos tres tablas denominadasunir tres tablas usando 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 

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

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

construyo 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 habría de forma normalizada, si quiero encontrar quién es el gerente sobre otra:

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

en el primer resultado se establece erróneamente los datos de Ahmed y Ali – NineCattoRules

Respuesta

105

Sólo tiene que utilizar:

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

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

141

sintaxis uso ANSI y que será una mucho más clara de cómo se está uniendo 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 
+5

@Muhammad: Nuestras respuestas son las mismas, sólo difieren en la sintaxis. Si no conoce la sintaxis 'ANSI', vale la pena su tiempo para aprenderlo. Te ayudará a evitar errores de 'UNIRSE' como lo hiciste en el futuro. – RedFilter

+0

Gracias, trabaja para mí. :) –

+0

Gracias funciona para mí –

14

Para normalizar 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 
1

Utilice esta:

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

Esta respuesta no agrega nada nuevo a esta pregunta y utiliza una sintaxis extraña (si no es que está completamente mal) , Me sorprendería si esto fuera incluso válido en MySQL). – AeroX

+0

No estoy de acuerdo con AeroX. La sintaxis de unión de Ansi tiene la intención de eliminar la ambigüedad de los problemas con la sintaxis de unión de la vieja escuela/donde. Estoy buscando ver si MySql admite la sintaxis de unión ansi específicamente. –

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; 

Usted puede unir varias tablas como ésta ejemplo anterior.

0

consultas para incorporar 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 
0
   select tb1.knames, 
       tb3.*, 
       tb2.* 
       from tb3 join tb1 
       on tb3.nid=tb1.nid 
       join tb2 on 
       tb3.id=tb2.id 
Cuestiones relacionadas