Unire tre tabelle usando MySQL


117

Ho tre tavoli denominati

**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 mostrare il nome dello studente con il nome del corso con cui aveva studiato,

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

Costruisco la 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 cosa sarebbe per la forma normalizzata, se voglio scoprire chi è il manager rispetto agli 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

nel primo risultato hai impostato erroneamente i dati per ahmed e ali
NineCattoRules

Risposte:



199

Usa la sintassi ANSI e sarà molto più chiaro come stai 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 

9
@ Muhammad: Le nostre risposte sono le stesse, differiscono solo nella sintassi. Se non sei a conoscenza della ANSIsintassi, vale la pena dedicare del tempo per impararla. Ti aiuterà a evitare JOINerrori come quelli che hai fatto in futuro.
RedFilter

16

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

L'ordine è importante in m.mid = e1.ide m.eid = e2.id?
Pathros

1
@ Pathros No, l'ordine non ha importanza, in quelle espressioni.
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

Questa risposta è molto simile alle risposte già fornite 5 anni prima. Qual è la tua risposta che ritieni importante e che manchi dalle risposte esistenti?
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;

Puoi UNIRE più TABELLE come nell'esempio sopra.


Ci sono già più risposte, di anni prima, che mostrano "l'unione di più tavoli". Cosa aggiunge la tua risposta alla discussione?
ToolmakerSteve

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

Ci sono già più risposte, di anni prima, che mostrano "l'unione di più tavoli". Cosa aggiunge la tua risposta alla discussione?
ToolmakerSteve

0

Usa questo:

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);

1
Questa risposta non aggiunge nulla di nuovo a questa domanda e usa una sintassi strana (se non una sintassi semplicemente sbagliata, sarei sorpreso se fosse valida anche in MySQL).
AeroX

Non sono d'accordo con AeroX. La sintassi di join Ansi ha lo scopo di chiarire i problemi con la vecchia sintassi virgola / where join. Sto cercando di vedere se MySql supporta specificamente la sintassi di join ansi.
Larry Smith

0

Non iscriverti in questo modo. È davvero una pessima pratica !!! Rallenterà le prestazioni durante il recupero di dati di grandi dimensioni. Ad esempio, se c'erano 100 righe in ogni tabella, il server di database deve recuperare i 100x100x100 = 1000000tempi. Doveva andare a prendere i 1 milliontempi. Per superare questo problema, unisci le prime due tabelle che possono recuperare il risultato nella corrispondenza minima possibile (dipende dallo schema del tuo database). Usa quel risultato in Subquery, quindi uniscilo alla terza tabella e recuperalo. Per il primissimo join -> 100x100= 10000volte e supponiamo di ottenere 5 risultati corrispondenti. E poi ci uniamo alla terza tabella con il risultato -> 5x100 = 500.Recupero totale = 10000+500 = 10200solo volte. E così, la performance è aumentata !!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.