从选择中选择最低值

时间:2014-05-13 19:41:06

标签: php mysql sql symfony doctrine-orm

我有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中显示我可以开始工作。

2 个答案:

答案 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