MySQL을 사용하여 세 테이블 조인


117

이름이 세 개의 테이블이 있습니다.

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

이제 그가 공부했던 과목 이름으로 학생 이름을 보여주기 위해,

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

다음 쿼리를 작성합니다.

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

그러나 필요한 결과를 반환하지 않습니다 ...

그리고 다른 사람보다 누가 관리자인지 찾고 싶다면 정규화 된 형식은 무엇입니까?

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

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

그리고이 결과를 얻고 싶습니다.

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

첫 번째 결과에서 당신은 잘못 아메드 알리에 대한 데이터를 설정
NineCattoRules

답변:



199

ANSI 구문을 사용하면 테이블을 조인하는 방법이 훨씬 더 명확 해집니다.

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 : 우리의 대답은 동일하며 구문 만 다릅니다. 당신이 인식하지 못하는 경우 ANSI구문, 그것을 배울 수있는 시간이 충분하다. JOIN미래에 저지른 오류 를 피하는 데 도움이됩니다 .
RedFilter

16

정규화 양식

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

순서에 문제가 있나요 m.mid = e1.idm.eid = e2.id?
Pathros

1
@Pathros 아니요, 순서는 중요하지 않습니다.
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

이 답변은 이미 5 년 전에 주어진 답변과 매우 유사합니다. 귀하의 답변에 대해 중요하고 기존 답변에서 누락되었다고 생각하십니까?
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;

위의 예와 같이 여러 테이블을 조인 할 수 있습니다.


이미 몇 년 전부터 "여러 테이블 조인"을 보여주는 여러 답변이 있습니다. 귀하의 답변은 토론에 무엇을 추가합니까?
ToolmakerSteve

0

두 개 이상의 테이블을 조인하기위한 쿼리 :

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

이미 몇 년 전부터 "여러 테이블 조인"을 보여주는 여러 답변이 있습니다. 귀하의 답변은 토론에 무엇을 추가합니까?
ToolmakerSteve

0

이것을 사용하십시오 :

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
이 답변은이 질문에 새로운 것을 추가하지 않으며 이상하게 사용합니다 (일반적으로 잘못된 구문이 아니라면 이것이 MySQL에서도 유효하다면 놀랄 것입니다).
AeroX 2015

나는 AeroX에 동의하지 않습니다. Ansi 조인 구문은 구식 쉼표 / ​​where 조인 구문의 문제를 명확히하기위한 것입니다. MySql이 특별히 ansi 조인 구문을 지원하는지 확인하고 있습니다.
Larry Smith

0

그렇게 가입하지 마십시오. 정말 정말 나쁜 습관입니다 !!! 대용량 데이터를 가져올 때 성능이 저하됩니다. 예를 들어 각 테이블에 100 개의 행이있는 경우 데이터베이스 서버는 100x100x100 = 1000000시간 을 가져와야 합니다. 1 million시간 을 들여야했습니다 . 이 문제를 극복하려면 가능한 최소 일치 결과를 가져올 수있는 처음 두 테이블을 조인하십시오 (데이터베이스 스키마에 달려 있음). 그 결과를 Subquery에서 사용한 다음 세 번째 테이블과 조인하고 가져옵니다. 첫 번째 조인-> 100x100= 10000시간에 대해 5 개의 일치 결과가 있다고 가정합니다. 그런 다음 세 번째 테이블을 결과-> 5x100 = 500.Total fetch = 10000+500 = 10200times only 와 결합합니다 . 그래서 성능이 올라갔습니다 !!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.