【问题标题】:Symfony Doctrine: Use of subquery with "HAVING" clause without using EXISTSSymfony 原则:在不使用 EXISTS 的情况下使用带有“HAVING”子句的子查询
【发布时间】:2015-07-16 12:13:00
【问题描述】:

在 Symfony 项目中,我尝试使用计算字段进行查询。简化很多我的 SQL 会是这样的:

SELECT o.id, (p.price_a + p.price_b) as total_price
FROM objects o
INNER JOIN prices p
ON o.id = p.object_id
HAVING total_price > 10

我的计算字段更复杂,并且使用会发生变化的外部值,我无法预先计算它。

因为我只想要不同的 object.id,所以我将上面的代码添加为子查询:

SELECT DISTINCT o_id 
FROM (
  SELECT o.id as o_id, (p.price_a + p.price_b) as total_price
  FROM object o
  INNER JOIN price p
  ON o.id = p.object_id
  HAVING total_price > 10)

在 Symfony 中,我希望这个查询只返回不同的“对象”。

我用查询生成器尝试了很多选项,但我无法向“FROM”子句添加子查询。

我试图避免使用效率低下的 EXISTS 子句:

SELECT DISTINCT o.id 
FROM objects o
WHERE EXISTS (
  SELECT p.*, (p.price_a + p.price_b) as total_price
  FROM prices p
  WHERE o.id = p.object_id
  HAVING total_price > 10)

有没有什么方法可以在不使用“EXISTS”的情况下使用查询生成器来做到这一点?

【问题讨论】:

    标签: symfony doctrine-orm doctrine


    【解决方案1】:

    感谢 HIDDEN 关键字,我已经解决了这个问题。使用 HIDDEN 您可以标记一个字段以避免 ORM 获取。删除计算字段非常完美。

    使用 DQL:

    SELECT o, (p.price_a + p.price_b) AS HIDDEN total_price
    FROM TestObjectBundle:Object o
    INNER JOIN TestObjectBuncle:Price p
    GROUP BY o
    HAVING total_price > 10
    

    【讨论】:

    • 不幸的是,HIDDEN 在 IN 子查询中使用时将不起作用。请参考我的例子:gist.github.com/webdevilopers/aa6a0ea06d7b5d4f0b04
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多