【问题标题】:Select lowest value from select从选择中选择最小值
【发布时间】:2014-05-13 19:41:05
【问题描述】:

我有 3 个表都具有一对多关系

产品

id | slug |
1  | 1-a  |
2  | 2-a  |
3  | 3-a  |

产品库

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 的连接中使用子查询,所以我想弄清楚如何获得正确的产品图像以与产品相关联。

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

使用子选择似乎是错误的:

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 中显示我可以去上班。

【问题讨论】:

  • 你能在 WHERE 子句中使用子选择吗?如果没有,请查看非常古老的 MySQL 手册(4.0 或更早版本)。这些版本不支持子选择,并且手册显示了一些看起来不太好看的提示如何做到这一点。
  • 为什么需要加入产品 sku 表?我没有看到它被使用。
  • @TMcKeown 产品表和产品图片表是如何关联的
  • 拜托,你能发布你的实体代码吗??
  • 你试过用$em->createQuery()代替createQueryBuilder()吗?

标签: php mysql sql symfony doctrine-orm


【解决方案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)

【讨论】:

  • 你需要一些东西来确保 product_image.id 是对应的等级。此外,可能应该在 product.id 上分组,而不是 slug,并完成您的 HAVING 子句。
  • 您对没有比较运算符的 HAVING 子句有何期望?
【解决方案2】:

您可以使用反连接来做到这一点:

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

但是,您还没有说如何处理 tie,所以在 ties 的情况下,它返回多个记录。要在 tie 的情况下每个 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

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2013-04-03
    • 2015-09-07
    • 2011-12-14
    • 2021-05-06
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多