LIMIT само на една от таблиците в JOIN

Имам две таблици product и gallery. Всеки продукт може да има няколко изображения в gallery. Когато се опитам да получа LIMITED 5 продукта заедно с техните gallery записи, правя JOIN като:

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

Как мога да направя това чрез една заявка?


person arxoft    schedule 23.03.2014    source източник
comment
можете ли да публикувате очаквания резултат? искаш да кажеш, че имаш нужда от различни продукти?   -  person DevelopmentIsMyPassion    schedule 23.03.2014
comment
@AshReva Моля, проверете, редактирах   -  person arxoft    schedule 23.03.2014


Отговори (3)


Опитайте това, можете да изберете 5-те продукта чрез подзаявка и да се присъедините с изображения, така че да получите записите за 5 продукта, без значение колко изображения има всеки продукт

SELECT * FROM
 `gallery` g
INNER JOIN 
(SELECT * FROM  `product` LIMIT 5) p
 ON( p.product_id = g.product_id )
person M Khalid Junaid    schedule 23.03.2014
comment
Мерси. Защо не LEFT JOIN? - person arxoft; 23.03.2014
comment
Left ще върне всички изображения, дори които не са свързани с 5-те продукта от подзаявката, така че използвам вътрешно присъединяване - person M Khalid Junaid; 23.03.2014
comment
Ами ако използвам LEFT JOIN и WHERE g.product_id IS NOT NULL - person arxoft; 23.03.2014
comment
Да, ще работи по същия начин като вътрешното присъединяване, като използва клаузата where по-горе - person M Khalid Junaid; 23.03.2014

Можете да промените заявката си по този начин,

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

Но използването на подзаявка струва ефективността ви.

person ashish    schedule 23.03.2014

За да получите пет изображения за всеки продукт (което е погрешно тълкуване на въпроса):

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;
person Gordon Linoff    schedule 23.03.2014
comment
Благодаря, но този от @M Khalid е по-прост. - person arxoft; 23.03.2014
comment
@aceph. . . Не. Този отговор е правилен, а този не е, защото отговорих на грешния въпрос. Така или иначе ще оставя това. - person Gordon Linoff; 23.03.2014