2010-09-14 17 views
73

ho tre tabelle denominateunendo tre tabelle utilizzando 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 

Ora per visualizzare il nome studente con il nome del corso, che aveva studiato come,

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

costruisco seguente query

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 

Ma non restituisce il risultato richiesto ...

E quale sarebbe per forma normalizzata, se voglio trovare chi è responsabile più di altri:

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

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

e vuole ottenere questo risultato:

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

nel primo risultato che erroneamente impostare i dati per Ahmed e ali – NineCattoRules

risposta

105

utilizzare semplicemente:

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

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

141

sintassi uso ANSI e sarà un molto più chiaro come si stanno unendo le tabelle:

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: Le nostre risposte sono le stesse, differiscono solo nella sintassi. Se non si è a conoscenza della sintassi 'ANSI', vale la pena dedicare del tempo per apprenderla. Ti aiuterà a evitare errori "JOIN" come quelli che hai fatto in futuro. – RedFilter

+0

Grazie funziona per me. :) –

+0

Grazie funziona per me –

14

Per normalizzare 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

Utilizzare questa:

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

Questa risposta non aggiunge nulla di nuovo a questa domanda e utilizza una sintassi strana (se non in tinta unita) , Sarei sorpreso se questo fosse valido anche in MySQL). – AeroX

+0

Non sono d'accordo con AeroX. La sintassi di join di Ansi è pensata per chiarire i problemi con la virgola vecchia scuola/dove sintassi di join. Sto cercando di vedere se MySql supporta ansi sintassi di join in particolare. –

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; 

È possibile partecipare a più tabelle come questo esempio di cui sopra.

0

Query per unire più di due tabelle:

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