2017-02-03 16 views
0

使用MySQL 5.7,我有一個movie表有許多單值字段:有沒有辦法在一次與MySQL的通話中從大量的一對多表中提取數據?

+--------------+--------------+ 
| Field  | Type   | 
+--------------+--------------+ 
| id   | int(11)  | 
| title  | varchar(255) | 
| release_year | int(11)  | 
| rating  | int(11)  | 
+--------------+--------------+ 

當我調用該表的查詢,像SELECT * FROM movie WHERE id = 5它將只返回一個行與每一列的數據,符合市場預期。

我有一些與movie表有一對多關係的表。我有movie_subtitlemovie_languagemovie_actor等。這裏是一個例子:

+--------------+--------------+ 
| Field  | Type   | 
+--------------+--------------+ 
| id   | int(11)  | 
| movie_id  | int(11)  | 
| subtitle  | varchar(255) | 
+--------------+--------------+ 

我的問題是,爲了讓我得到所有的現場數據的一個單一的電影,看來我需要撥打約10 SELECT來電。一個用於movie表,然後每個添加附加表一個。

如果用戶有1,000部電影,這很快就會變成10,000 SELECT調用,如果我試圖對整個集合運行更大的查詢。

有沒有辦法讓這個所有輸出在之一打電話?或者這只是它應該的方式?我覺得有更好的方法來做到這一點,我只是沒有足夠的數據庫關係的教育,以瞭解我在這裏失蹤。

我需要將我從這些調用接收到的數據傳遞到我的PHP頁面以將其放入JSON中。

+0

是否有一個原因,你不只是使用連接將數據分組在一起?如果沒有表格結構,樣本數據(可能是sql fiddle)並且知道你想要作爲樣本,那麼這裏的人們只會猜測。 –

+0

我會建議要麼加入數據在一起,要麼執行多個查詢拉出額外的數據,你可以稍後在php中進行合併。在聯接的情況下,它的效果很好,但是通常在返回結果中會出現重複數據,您將不得不忽略一堆數據或根據輸出結果將數據組合到一個列中。使用多個查詢,它只爲一條記錄提供很少或沒有好處,但是對於多條記錄,您的查詢數量不會增加。 –

+0

'JOIN'將帶有相同數據的許多行帶回,除了一列之外...例如:電影Goonies將帶回三行,所有這些行都具有相同的數據,期望每一行中的'genre'列將是Adventure ,喜劇和家庭。只是尋找一種方法來避免這種情況。 –

回答

0

我會建議在php中做多個查詢和合並數據。這裏是電影和流派一個簡單的例子:

示例表:

Table: MOVIES 
    id, title, release_year, rating ...etc 

Table: MOVIES_GENRES (many-to-many relation to movies and genres) 
    movie_id, genre_id 

Table: GENRES 
    id, name, description 

Table: USERS_MOVIES (many-to-many relation to users and movies) 
    user_id, movie_id 

然後,你可以做這樣的事情:

//example user id 
$user_id = 5; 

//query for all movies 
$sql = "SELECT * FROM `movies` WHERE `id` IN (SELECT `movie_id` FROM `users_movies` WHERE `user_id`={$user_id})"; 

$result = /*perform query*/; 

//loop over the result 
$movies = array(); 
while($row = $result->fetch(PDO::FETCH_ASSOC)){ 
    //add the row to the movies array with the movie id as the key 
    $movies[$row['ID']] = $row; 

    //also add an empty genre array in anticipation of genre data being coalesced 
    $movies['genres'] = array(); 
} 

//get a comma separated list of all the movie ids for use in queries below 
$movieIDs = implode(',', array_keys($movies)); 

//now query out genre based on movies, make sure to get the movie_id for coalesce 
$sql = "SELECT `movie_id`, `name`, `description` FROM `genres` JOIN `movies_genres` ON `genre_id`=`genres`.`id` WHERE `movie_id` IN ({$movieIDs})"; 

$result = /*perform query*/; 

//loop over the result 
while($row = $result->fetch(PDO::FETCH_ASSOC)){ 
    //add the genre to this movie 
    $movies[$row['movie_id']]['genres'][] = $row; 
} 

在這整個事情,我只用兩個查詢不管有多少部電影。我只是生成所有電影ID的列表,並在隨後的查詢中使用它。然後在PHP中將數據合併回來。稍後,我可以遍歷$movies數組,並使用它來構建表或我需要的任何東西。在流派查詢中,您還可以在movie_id上包含連接(或子查詢)到users_movies,然後不需要大的IN列表,但可以使用上面的user_id。

相關問題