2016-03-11 20 views
0

我有表電影,movie_client,language_movie,語言,subtitle_movie和字幕MySQL查詢表連接給人重複的行

我要選擇與自己的字幕和語言的所有電影,其中的client_id(在movie_client)爲1

 SELECT * FROM movie 
     LEFT OUTER JOIN movie_client 
     ON movie.movie_id = movie_client.movie_client_id 
     LEFT OUTER JOIN client 
     ON movie_client.client_movie_id = client.client_id 

     LEFT OUTER JOIN language_movie 
     ON movie.movie_id = language_movie.movie_id 
     LEFT OUTER JOIN language 
     ON language_movie.language_id = language.language_id 

     LEFT OUTER JOIN subtitle_movie 
     ON movie.movie_id = subtitle_movie.movie_id 
     LEFT OUTER JOIN subtitle 
     ON subtitle_movie.subtitle_id = subtitle.subtitle_id 

     WHERE client.client_id=1 

這不會工作因爲我得到重複的行我試圖內部連接作爲膨脹,但它只是不會工作。任何人都可以幫助我正確的查詢?

+0

移動' client.client_id = 1'條件它是'ON'子句以獲得真正的左連接行爲。現在您可以定期獲得內部連接結果。 – jarlh

+0

如果電影中有兩種語言的字幕,或者是兩種語言,您將獲得該電影兩次。這是預期的結果。如果你想要每部電影只有一次,你必須描述如何選擇語言,字幕等。 – jarlh

回答

0

FROM movie 
    LEFT OUTER JOIN movie_client 
    ON movie.movie_id = movie_client.movie_client_id 
    LEFT OUTER JOIN client 
    ON movie_client.client_movie_id = client.client_id 

應該是內部聯接,你並不需要所有的電影

SELECT * FROM movie 
    INNER JOIN movie_client 
    ON movie.movie_id = movie_client.movie_client_id 
    INNER JOIN client 
    ON movie_client.client_movie_id = client.client_id 

    LEFT OUTER JOIN language_movie 
    ON movie.movie_id = language_movie.movie_id 
    LEFT OUTER JOIN language 
    ON language_movie.language_id = language.language_id 

    LEFT OUTER JOIN subtitle_movie 
    ON movie.movie_id = subtitle_movie.movie_id 
    LEFT OUTER JOIN subtitle 
    ON subtitle_movie.subtitle_id = subtitle.subtitle_id 

    WHERE client.client_id=1 

檢查this to understand difference INNER and OUTER JOIN

+0

它不工作仍然獲得每部電影兩次。 –

+0

@jarlh指出,如果電影有2種語言,或者字幕有2種語言,你會將行加倍。如果有2個,應該留下哪種語言? – StanislavL

+0

是的,我知道,但我得到了同樣的結果,從一切兩次,所以一個電影與一種語言兩次輸出 –

1

試試看:

SELECT distinct m.movie_id, lm.language_id, sm.subtitle_id FROM movie m 
    INNER JOIN movie_client mc 
    ON m.movie_id = mc.movie_client_id 
    INNER JOIN client 
    ON mc.client_movie_id = c.client_id 

    INNER JOIN lm 
    ON m.movie_id = lm.movie_id 
    INNER JOIN language l 
    ON lm.language_id = l.language_id 

    INNER JOIN subtitle_movie sm 
    ON m.movie_id = sm.movie_id 
    INNER JOIN JOIN subtitle s 
    ON sm.subtitle_id = s.subtitle_id 

    WHERE client.client_id=1