2012-05-13 58 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