programing

MySQL을 사용한 3개의 테이블 결합

sourcejob 2022. 9. 26. 22:00
반응형

MySQL을 사용한 3개의 테이블 결합

테이블이 3개 있는데

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

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 

사용방법:

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

정규화된 폼의 경우

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

그렇게 가입하지 마세요.정말 나쁜 습관이야!!!대용량의 데이터를 취득할 때의 퍼포먼스를 저하시게 됩니다.예를 들어, 각 테이블에 100개의 행이 있는 경우 데이터베이스 서버는 다음을 가져와야 합니다.100x100x100 = 1000000몇 번이고, 몇 번이고 팔아야 했다.1 million이 문제를 해결하려면 일치 가능한 최소값으로 결과를 가져올 수 있는 첫 번째 두 테이블을 결합하십시오(데이터베이스 스키마에 따라 다름).이 결과를 Subquery에서 사용한 후 세 번째 테이블과 결합하여 가져옵니다.첫 참가 -->100x100= 100005개의 일치 결과를 얻었다고 가정합니다.그리고 세 번째 표에 결과를 표시합니다. -- >5x100 = 500.총 가져오기 =10000+500 = 10500시간만.이렇게 해서 퍼포먼스가 올라갔어요!!!

join 쿼리에는 3개의 테이블이 포함되어 있으며 조인 내의 각 테이블에 대해 에일리어스 이름을 설정한 동일한 컬럼에서 2개의 값이 필요합니다.같은 테이블명도 다른 이름으로 선언합니다.

const sql = `select p.ID,p.purchaseamount,urs.name as 
            buyername,pd.productname,
            pd.amount,urs1.name as sellername
            from  purchases p
            left join products pd on p.productid=pd.ID
            left join users urs on p.userid=urs.ID 
            left join users urs1 on  pd.userid=urs1.ID`
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;

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

MySQL에서 사용할 수 있는 이전 답변에 포인트를 추가합니다.

table_factor syntax 

또는

joined_table syntax

mysql 문서

Table_factor 예시

SELECT prd.name, b.name 
FROM products prd, buyers b

조인드 테이블의 예시

SELECT prd.name, b.name 
FROM products prd
 left join buyers b on b.bid = prd.bid;

FYI: 조인된 테이블의 왼쪽 조인은 그다지 의미가 없습니다(실제로는 조인 테이블을 사용하여 구매자를 제품 테이블에 연결하는 대신 구매자를 연결합니다).제품 테이블의 ID).

Query for three table join and limit set

SELECT * FROM (SELECT t1.follower_userid, t2.*, t3.login_thumb, t3.login_name, 
  t3.bio, t3.account_status, t3.gender
     FROM videos t2
      LEFT JOIN follower t1
        ON t1.follower_userid = t2.user_id 
         LEFT JOIN videos_user t3 
          ON t1.follower_userid  = t3.login_userid
           WHERE t1.following_userid='$userid'
            LIMIT $startpoint , $limit) AS ID 
             ORDER BY ID DESC

세 개 이상의 테이블을 결합하기 위한 쿼리:

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

사용방법:

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

언급URL : https://stackoverflow.com/questions/3709560/joining-three-tables-using-mysql

반응형