2012-05-13 95 views
0

我現在有兩個疑問:加入mySQL查詢並只返回某些結果?

$iQ = mysql_query("SELECT * FROM `movies` WHERE `released` > '" . $begin . 
    "' AND `released` < '" . $end . "' ORDER BY `views` DESC LIMIT 5"); 

while ($iR = mysql_fetch_array($iQ)) { 
    $imageQ = mysql_query("SELECT * FROM `movie_image` 
     WHERE `movie_id` = '" . $iR['id'] . "' AND `image_size` = 'thumb' 
     AND `type` = 'poster' LIMIT 1"); 
} 

我希望把這個給一個查詢的,我只希望如果有排在movie_image表,這意味着電影無圖像不會被送回返回結果在結果集中。

我該如何去加入這兩個查詢,這樣我就可以用第一個查詢獲得電影圖像,並且只有在電影圖像存在時才返回結果。

讓我知道如果你不明白,我會嘗試重述我的問題。

回答

0
SELECT * FROM `movies` 
    INNER JOIN `movie_image` ON `movie_image`.`movie_id` = `movies`.`id` 
    WHERE `movies`.`released` > '" . $begin . "' 
    AND `movies`.`released` < '" . $end . "' 
    AND `movie_image`.`image_size` = 'thumb' 
    AND `type` = 'poster' ORDER BY `movies`.`views` DESC LIMIT 5 

此查詢應該適合您。

+0

這是帶回2的相同結果,一切都有相同的圖像。 – Latox

+0

我猜你每部電影都有多個影像? – Tushar

+0

是的,每部電影都有多個圖像,我也需要'電影「表中的信息。 – Latox

0

這裏的關係的第一件事是一對多關係,所以你不能在一個查詢中做到這一點。

其次,如果有電影圖像存在,要返回電影,則需要檢查第一個查詢中的內容,然後遍歷第一個查詢以獲取與每部電影相關的圖像。

$iq = "SELECT m.* FROM `movies` m 
     RIGHT JOIN `movie_images` mi ON mi.movie_id = m.movie_id 
     WHERE `m.released` > '" 
     . $begin . "' AND `m.released` < '" . $end . "' GROUP BY `m.movie_id` ORDER BY `m.views` 
     DESC LIMIT 5"; 

$res = mysql_query($iq); 
while($ir = mysql_fetch_assoc($res)){ 
    //get the images for each movie here 
} 
+0

這似乎不工作:( – Latox

+0

)第一個查詢得到了什麼?您應該獲得所有在'movie_images'中至少有一個圖像的電影 – Broncha

0

我認爲這個查詢可以幫助你。如果電影表標識符= id(ms.id)。

SELECT mi.* FROM movie_image mi 
    JOIN movies ms ON mi.movie_id = ms.id 
    WHERE ms.released > '" . $begin . "' 
    AND ms.released < '" . $end . "' 
    AND mi.image_size = 'thumb' AND mi.type = 'poster' 
    ORDER BY ms.views DESC LIMIT 5 
0

如果你想選擇匹配的圖像之一,但不關心哪(那是你當前的查詢做什麼),你可以加入我認爲這是UNIQUE中的表和GROUP BY電影ID( movies,例如主鍵):

SELECT * 
FROM  movies 
    JOIN movie_image 
     ON movie_image.movie_id = movies.id 
    AND movie_image.image_size = 'thumb' 
    AND movie_image.type = 'poster' 
WHERE movies.released BETWEEN :begin AND :end 
GROUP BY movies.id 
ORDER BY views DESC 
LIMIT 5