我有3张桌子都有一对多的关系
产品
id | slug |
1 | 1-a |
2 | 2-a |
3 | 3-a |
产品Sku
id | product_id |
1 | 1 |
2 | 1 |
3 | 2 |
产品图片
id | product_sku_id | rank |
1 | 1 | 0 |
2 | 2 | 1 |
3 | 3 | 0 |
我要做的是在单个查询中返回Product.slug和具有最低排名的Product_Image.id。
我现在正在使用的是Doctrine并且我不能在Doctrine中加入子查询,所以我想弄清楚的是如何获得正确的产品Image以与产品相关联。
SELECT
p.slug,pi.id
FROM
product p
JOIN
product_sku ps
ON
p.id = ps.product_id
JOIN
product_image pi
ON
ps.id = pi.product_sku_id
GROUP BY
p.slug
使用subselect似乎错了:
SELECT
p.slug,pi.id
FROM
product p
JOIN
product_sku ps
ON
p.id = ps.product_id
JOIN
(SELECT
pi.*
product_image pi
ORDER BY
pi.rank ) as pi
ON
ps.id = pi.product_sku_id
GROUP BY
p.slug
到目前为止我的学说:
$this->entityManager->createQueryBuilder()
->select('DISTINCT p.slug,p.id')
->join('p.productSkus', 'ps)
->join('ps.productImages','pi');
任何帮助将不胜感激,谢谢。
编辑:这是一个过于简化的查询我想要完成的事情还有很多事情不会影响问题,但要求我使用NATIVE SQL以外的其他东西我只是在SQL中显示我可以开始工作。
答案 0 :(得分:1)
SELECT
p.slug,pi.id
FROM
product p
JOIN
product_sku ps
ON
p.id = ps.product_id
JOIN
product_image pi
ON
ps.id = pi.product_sku_id
GROUP BY
p.slug
HAVING min(pi.rank)
答案 1 :(得分:1)
您可以使用反连接执行此操作:
SELECT p.slug, pi.id
FROM product p
JOIN product_sku ps
ON ps.product_id = p.id
JOIN product_image pi
ON pi.product_sku_id = ps.id
LEFT JOIN product_image pi2
ON pi2.product_sku_id = ps.id AND pi2.rank < pi.rank
WHERE pi2.rank IS NULL
但是,你还没有说过如何处理关系,所以在关系的情况下,它会返回多条记录。在绑定的情况下,每个slug只获得一个图像id,那么你可以使用GROUP BY
并让MySQL选择一个:
SELECT p.slug, pi.id
FROM product p
JOIN product_sku ps
ON ps.product_id = p.id
JOIN product_image pi
ON pi.product_sku_id = ps.id
LEFT JOIN product_image pi2
ON pi2.product_sku_id = ps.id AND pi2.rank < pi.rank
WHERE pi2.rank IS NULL
GROUP BY p.id