[英]Join mySQL query and only return certain results?
我目前有两个查询:
$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表中有行的情况下返回结果,这意味着没有图像的电影将不返回结果集中。
我如何才能加入这两个查询,因此我可以在第一个查询中获得电影图像,并且仅当存在电影ID的电影图像时才返回结果?
如果您不理解,请告诉我,我将尝试重述我的问题。
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
此查询应该为您工作。
首先,这里的关系是一对多关系,因此您不能在一个查询中进行。
其次,要返回电影(如果存在电影图像),则需要在第一个查询中进行检查,然后遍历第一个查询以获取与每个电影相关的图像。
$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
}
我认为该查询对您有所帮助。 如果电影表标识符= 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
如果您想选择一个匹配的图像,但是不在乎哪个(这就是您当前的查询所做的),则可以将表和GROUP BY
影片ID UNIQUE
在一起(我假设它在movies
是UNIQUE
,例如主键) ):
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.