2017-11-22 7 views
0

4 개의 테이블이있는 데이터베이스가 있습니다.하나가 아닌 두 개의 필드로 두 테이블의 내부 조인 수행

설정

영화

트레일러

리뷰

final String SQL_CREATE_MOVIE__SETTING_TABLE = "CREATE TABLE " + MovieContract.MovieSettings.TABLE_NAME + " (" + 
      MovieContract.MovieEntry._ID + " INTEGER PRIMARY KEY, " + 
      MovieContract.MovieSettings.COL_MOVIE_SETTING + " TEXT UNIQUE NOT NULL " + 
      ");"; 

    final String SQL_CREATE_MOVIE_TABLE = "CREATE TABLE " + MovieContract.MovieEntry.TABLE_NAME + " (" + 
      MovieContract.MovieEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      MovieContract.MovieEntry.COL_MOVIE_KEY + " INTEGER NOT NULL, " + 
      MovieContract.MovieEntry.COL_MOVIE_ID + " INTEGER NOT NULL, " + 
      MovieContract.MovieEntry.COL_BACKDROP_PATH + " TEXT NOT NULL, " + 
      MovieContract.MovieEntry.COL_ORIGINAL_LANGUAGE + " TEXT NOT NULL, " + 
      MovieContract.MovieEntry.COL_ORIGINAL_TITLE + " TEXT NOT NULL," + 
      MovieContract.MovieEntry.COL_OVERVIEW + " TEXT NOT NULL, " + 
      MovieContract.MovieEntry.COL_TITLE + " TEXT NOT NULL, " + 
      MovieContract.MovieEntry.COL_VOTE_AVERAGE + " REAL NOT NULL, " + 
      MovieContract.MovieEntry.COL_VOTE_COUNT + " INTEGER NOT NULL, " + 
      MovieContract.MovieEntry.COL_POSTER_PATH + " TEXT NOT NULL, " + 
      MovieContract.MovieEntry.COL_DATE + " TEXT NOT NULL, " + 

      // Set up the location column as a foreign key to location table. 
      " FOREIGN KEY (" + MovieContract.MovieEntry.COL_MOVIE_KEY + ") REFERENCES " + 
      MovieContract.MovieSettings.TABLE_NAME + " (" + MovieContract.MovieSettings._ID + "), " + 

      // To assure the application have just one weather entry per day 
      // per location, it's created a UNIQUE constraint with REPLACE strategy 
      " UNIQUE (" + MovieContract.MovieEntry.COL_DATE + ", " + 
      MovieContract.MovieEntry.COL_MOVIE_KEY + ") ON CONFLICT REPLACE);"; 

    final String SQL_CREATE_TRAILER_TABLE = "CREATE TABLE " + MovieContract.TrailerEntry.TABLE_NAME + " (" + 
      MovieContract.TrailerEntry._ID + " INTEGER PRIMARY KEY," + 
      MovieContract.TrailerEntry.COL_MOVIE_ID + " INTEGER NOT NULL, " + 
      MovieContract.TrailerEntry.COL_TRAILER_ID + " TEXT NOT NULL, " + 
      MovieContract.TrailerEntry.COL_ISO_369_1 + " TEXT NOT NULL, " + 
      MovieContract.TrailerEntry.COL_KEY + " TEXT NOT NULL, " + 
      MovieContract.TrailerEntry.COL_NAME + " TEXT NOT NULL, " + 
      MovieContract.TrailerEntry.COL_SITE + " TEXT NOT NULL, " + 
      MovieContract.TrailerEntry.COL_SIZE + " TEXT NOT NULL, " + 
      MovieContract.TrailerEntry.COL_TYPE + " TEXT NOT NULL, " + 


      // Set up the movie_id column as a foreign key to movie table. 
      " FOREIGN KEY (" + MovieContract.TrailerEntry.COL_MOVIE_ID + ") REFERENCES " + 
      MovieContract.MovieEntry.TABLE_NAME + " (" + MovieContract.MovieEntry.COL_MOVIE_ID + ") " + 

      " UNIQUE (" + MovieContract.TrailerEntry.COL_MOVIE_ID + ", " + 
      MovieContract.TrailerEntry.COL_TRAILER_ID + ") ON CONFLICT REPLACE);"; 

    final String SQL_CREATE_REVIEW_TABLE = "CREATE TABLE " + MovieContract.ReviewEntry.TABLE_NAME + " (" + 
      MovieContract.ReviewEntry._ID + " INTEGER PRIMARY KEY," + 
      MovieContract.ReviewEntry.COL_MOVIE_ID + " INTEGER NOT NULL, " + 
      MovieContract.ReviewEntry.COL_REVIEW_ID + " TEXT NOT NULL, " + 
      MovieContract.ReviewEntry.COL_AUTHOR + " TEXT NOT NULL, " + 
      MovieContract.ReviewEntry.COL_CONTENT + " TEXT NOT NULL, " + 
      MovieContract.ReviewEntry.COL_URL + " TEXT NOT NULL, " + 

      // Set up the movie_id column as a foreign key to movie table. 
      " FOREIGN KEY (" + MovieContract.ReviewEntry.COL_MOVIE_ID + ") REFERENCES " + 
      MovieContract.MovieEntry.TABLE_NAME + " (" + MovieContract.MovieEntry.COL_MOVIE_ID + ") " + 

      " UNIQUE (" + MovieContract.ReviewEntry.COL_MOVIE_ID + ", " + 
      MovieContract.ReviewEntry.COL_REVIEW_ID + ") ON CONFLICT REPLACE);"; 

내가있는 지금 원하는 예고편 테이블을 영화 테이블에 결합하십시오. 따라서 새 트레일러 테이블에는 다음과 같은 열이 있어야합니다.

---------------------------------------------------------------------------------- 
|_id |movie_id |poster_path |id |iso_639_1 |key |name |site |size |type | 

열 영화 테이블에 속하는 및 poster_path을 movie_id. 나는 내가 poster_path 열이없는이 테이블

-------------------------------------------------------------------- 
|_id |movie_id |id |iso_639_1 |key |name |site |size |type | 

를 얻을 그러나

sTrailerByMovieIdQueryBuilder.setTables(
      MovieContract.TrailerEntry.TABLE_NAME + " INNER JOIN " + 
      MovieContract.MovieEntry.TABLE_NAME + " ON " + 
      MovieContract.TrailerEntry.TABLE_NAME + "." + 
      MovieContract.TrailerEntry.COL_MOVIE_ID + " = " + 
      MovieContract.MovieEntry.TABLE_NAME + "." + 
      MovieContract.MovieEntry.COL_MOVIE_ID + " AND " + 
      MovieContract.MovieEntry.TABLE_NAME + "." + 
      MovieContract.MovieEntry.COL_POSTER_PATH 
     ); 

로 내부 조인 수행합니다. 내 속속들이 뭔가 잘못 했어.하지만 어떻게 고쳐야할지 모르겠다.

감사합니다.

테오.

+0

을 그리고 당신은 하나의 테이블 열을 언급 :

trailers INNER JOIN movies ON trailers.movie_id = movies.movie_id AND movies.poster_path 

귀하의 질의는 다음과 같아야합니다. https://stackoverflow.com/questions/2366780/how-to-do-an-inner-join-on-multiple-columns –

답변

0

poster_path 열이 누락 된 이유는 쿼리에서 다른 내부 조인을 호출하지 않았기 때문입니다.

는 현재 쿼리는 다음과 같습니다 후

... 
INNER JOIN movies m1 
ON trailers.movie_id = m1.movie_id 
INNER JOIN movies m2 
ON trailers.poster_path = m2.poster_path 
+0

답변을 주셔서 감사합니다.하지만 m1은 무엇입니까? – Theo

+0

또한 예고편 테이블에 poster_path를 선언하지 않았습니다. – Theo

+0

테이블의 별칭입니다. '영화 AS m1'도 할 수 있습니다 – ppgdn