데이터베이스 테이블 3개 조인하는법..

jamie97의 이미지

안녕하세요 혼자 해결해보려 했는데 아무리 구글링을 해봐도 이해가 잘 안가고 도무지 해결이 안 되어서 질문 올립니다ㅜㅜ..
제가 첨부한 사진과 같이 VideoShop이라는 테이블에는 mvcode(비디오코드)가 PK로 설정이 되어있고,
LendVideo테이블이 FK로 받고있습니다. 마찬가지로 UserList테이블의 userid(회원아이디)가 PK로 설정되어 있고,
LendVideo테이블이 FK로 받고 있는 상황입니다.

현재 테이블마다 컬럼은 다음과 같이 구성되어 있습니다.
=====================================================================================
[VideoShop 테이블]
mvcode(비디오코드) | mvgenre(장르) | mvtitle(비디오제목) | mvactor(주연) |
mvdirector(감독) | mvcorp(배급사) | mvprice(가격) | mvstock(재고) | mvdate(등록일)
=====================================================================================
[LendVideo 테이블]
lendcode(대여코드) | lenddate(대여일) | lendreturn(반납예정일) | lendstate(상태) |
lendextend(기간연장)
=====================================================================================
[UserList 테이블]
usernum(회원코드) | userid(회원아이디) | username(회원이름) | usertel(연락처) |
useraddr(주소) | join_date(가입일)
=====================================================================================

여기서 제가 출력하고자 하는 것은,

대여코드(lendcode) | 회원아이디(userid) | 회원이름(username) | 비디오제목(mvtitle) | 대여일(lenddate) | 반납예정일(lendreturn) |
상태(lendstate) | 기간연장(lendextend) 컬럼 순서대로 출력하되, 대여코드는 오름차순으로 출력하여 한번에 보여지게 하고싶은데요..ㅜㅜ

LendVideo테이블의 컬럼은 전부 보여주면서 VideoShop테이블의 mvtitle과 UserList테이블의 userid, username을 조인해서 가져오려면 어떻게 해야할까요??

File attachments: 
첨부파일 크기
Image icon fdfd.JPG94.36 KB
swish95의 이미지

query 가 필요한건가요?

VideoShop, UserList 테이블에 해당 키가 pk 이기 때문에 테이블 3개를 조인할수도 있지만
각 키값을 통한 subquery 로도 가능합니다.

------------------------------------------------------------
ProgrammingHolic

익명 사용자의 이미지

Natural join으로 깔끔하게 해결될 상황인 것으로 보입니다.

https://keep-cool.tistory.com/41
https://www.w3resource.com/sql/joins/natural-join.php

chanik의 이미지

내용을 매우 일목요연하게 정리해서 올려주셨는데
질문내용에서 바로 답이 나올만한 기본적인 join입니다.
테이블 세 개를 join하려시면 아래와 같이 하시거나,

SELECT lendcode, L.userid, username, mvtitle, enddate, lendreturn, lendstate, lendextend
  FROM LendVideo L
    INNER JOIN UserList  U ON L.userid = U.userid
    INNER JOIN VideoShop V ON L.mvcode = V.mvcode
 ORDER BY lendcode ASC

아래와 같이 하시면 되겠습니다.

SELECT lendcode, L.userid, username, mvtitle, enddate, lendreturn, lendstate, lendextend
  FROM LendVideo L, UserList U, VideoShop V
 WHERE L.userid = U.userid AND L.mvcode = V.mvcode
 ORDER BY lendcode ASC

테스트는 해보지 않았고,
이름이 겹치지 않는 컬럼에 대해서는 table alias를 생략했습니다.

swish95의 이미지

사용자 숫자와 비디오 갯수가 상대적으로 많고
비디오 대여 횟수가 상대적으로 작다면 다음처럼 해도 됩니다.

SELECT lendcode, L.userid
   , (select username from UserList U where U.userid = L.userid) as username
   , (select mvtitle from VideoShop V where V.mvcode = L.mvcode) as mvtitle
   , enddate, lendreturn, lendstate, lendextend
FROM LendVideo L
 ORDER BY lendcode ASC

위와 같이 쿼리를 구성한 이유는 다음과 같습니다.
1. 사용자는 많지만(사용자 테이블이 크지만) 빌려가는 사람은 별로 없다(상대적으로 참조할 사용자가 별로 없다)
2. 비디오의 종류는 많지만(비디오 테이블이 크지만) 빌려간 비디오는 별로 없다(상대적으로 참조한 비디오가 별로 없다)

위와 같은 조건일때 큰테이블 2개를 join 하면 불필요하게 큰 테이블이 생성(테이블의 곱) 되므로
일단 빌려간 비디오의 정보만 취한뒤에 각각의 정보는 서브 쿼리로 바로 검색(pk 이므로 해쉬 검색 가능) 하는게 결과적으로 성능향상에 도움이 됩니다.

음.. 근데 쓰고 보니 이거 혹시 리포트 용인가요?
답 알려준거 보다는 제가 굳이 chanik 님의 정답에 대해 다시 댓글을 단 이유를 알아주셨으면 좋겠네요

------------------------------------------------------------
ProgrammingHolic

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.