仅在JOIN中的一个表上限制

时间:2014-03-23 15:04:41

标签: mysql join left-join

我有两张表productgallery。每个产品可以在gallery中包含多个图像。当我尝试获取LIMITed 5产品及其gallery记录时,我会像以下一样加入:

SELECT * FROM `product` p LEFT JOIN `gallery` g ON p.product_id = g.product_id 
LIMIT 0,5

此查询返回5条记录(即仅3个产品),如:

product_id   name   image
1            p1     im1.jpg
1            p1     im3.jpg
1            p1     xyz.jpg
2            p2     abc.jpg
3            p3     tuy.jpg

我需要的只是5种产品,无论每种产品有多少gallery条记录,无论总记录数是多少。这是我的预期结果:

product_id   name   image
1            p1     im1.jpg
1            p1     im3.jpg
1            p1     xyz.jpg
2            p2     abc.jpg
3            p3     tuy.jpg
4            p4     a32.jpg
4            p4     t22.jpg
4            p4     a13c.jpg
5            p5     t34y.jpg

如何通过单个查询完成此操作?

3 个答案:

答案 0 :(得分:2)

试试这个你可以通过子查询选择5个产品并加入图片,这样你就可以获得5个产品的记录,无论每个产品有多少图像

SELECT * FROM
 `gallery` g
INNER JOIN 
(SELECT * FROM  `product` LIMIT 5) p
 ON( p.product_id = g.product_id )

答案 1 :(得分:0)

为每个产品获取五张图片(这是对问题的误解):

SELECT *
FROM `product` p LEFT JOIN
     `gallery` g
     ON p.product_id = g.product_id 
WHERE 5 <= (select count(*)
            from gallery g2
            where g2.product_id = g.product_id and g2.image <= g.image
           );

另一种方法是将图像放入一个逗号分隔的列中:

select p.*, substring_index(group_concat(distinct image), ',', 5) as images
from product p left join
     gallery g
     on p.product_id = g.product_id
group by p.product_id;

答案 2 :(得分:0)

您可以像这样修改您的查询,

SELECT * FROM `product` p LEFT JOIN (SELECT * FROM `gallery` LIMIT 0,5) as g ON    p.product_id = g.product_id 

但是,使用子查询会降低您的效果。