Pytanie Łączenie trzech tabel za pomocą MySQL


Mam trzy tabele o nazwie

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

Teraz, aby pokazać nazwisko ucznia z nazwą kursu, którego uczył się,

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

Buduję następujące zapytanie

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

Ale nie zwraca wymaganego wyniku ...

A co byłoby dla znormalizowanej formy, jeśli chcę znaleźć kto jest menedżerem nad innym:

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

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

I chce uzyskać ten wynik:

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

85
2017-09-14 13:58


pochodzenie


w pierwszym wyniku błędnie ustawiłeś dane dla ahmed i ali - NineCattoRules


Odpowiedzi:


Po prostu użyj:

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

117
2017-09-14 14:11



Widzieć stackoverflow.com/questions/13476029/... - thdoan


Użyj składni ANSI i będzie o wiele bardziej przejrzyste, jak dołączasz do tabel:

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 

155
2017-09-14 14:00



@Muhammad: Nasze odpowiedzi są takie same, różnią się tylko składnią. Jeśli nie jesteś tego świadomy ANSI składnia, warto poświęcić czas na naukę. Pomoże ci to uniknąć JOIN błędy, które popełniłeś w przyszłości. - RedFilter


Dla znormalizowania formy

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

16
2017-09-21 06:21



Czy zamówienie ma znaczenie? m.mid = e1.id i m.eid = e2.id? - Pathros


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

5
2017-07-31 14:46





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;

Możesz POŁĄCZYĆ wiele TABLI, takich jak ten przykład powyżej.


3
2018-06-12 12:06





Użyj tego:

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
2018-04-29 17:22



Ta odpowiedź nie dodaje nic nowego do tego pytania i używa dziwnej (jeśli nie prostej błędnej składni, byłbym zaskoczony, gdyby było to nawet poprawne w MySQL). - AeroX
Nie zgadzam się z AeroX. Składnia łączenia Ansi ma na celu ujednolicenie problemów ze starym przecinkiem szkolnym / gdzie składnia dołączenia. Czekam, aby zobaczyć, czy MySql obsługuje specyficzne składni ANSI join. - Larry Smith


Zapytanie o dołączenie do więcej niż dwóch tabel:

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
2018-02-08 09:36