Php 交叉连接到DQL
我正在尝试将这个我认为简单的mysql查询转换为原则dql,然而,我现在经历了一场相当大的斗争Php 交叉连接到DQL,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我正在尝试将这个我认为简单的mysql查询转换为原则dql,然而,我现在经历了一场相当大的斗争 SELECT (c.prix-aggregates.AVG) AS test FROM immobilier_ad_blank c CROSS JOIN ( SELECT AVG(prix) AS AVG FROM immobilier_ad_blank) AS aggregates 目的:创建z分数。 最初的实现来自这个问题 我考虑过在实体中创建一个关联,但我的意思是它
SELECT (c.prix-aggregates.AVG) AS test
FROM immobilier_ad_blank c
CROSS JOIN (
SELECT AVG(prix) AS AVG
FROM immobilier_ad_blank)
AS aggregates
目的:创建z分数。
最初的实现来自这个问题
我考虑过在实体中创建一个关联,但我的意思是它不是必需的,它只是用于统计
编辑:顺便说一句,我不想使用原始SQL,我将使用getDQL
从另一个查询生成器表达式中提取“子查询”。否则,我将不得不重写我的动态查询生成器以考虑rawSQL
编辑2:
试过这个
$subQb = $this->_em->createQueryBuilder();
$subQb->addSelect("AVG(subC.prix) as AMEAN")
->from("MomoaIntegrationBundle:sources\Common", "subC");
$subDql = $subQb->getDQL();
$dql = "SELECT c.prix FROM MomoaIntegrationBundle:sources\Common c INNER JOIN ($subDql) AS aggregates";
原始dql是:
SELECT c.prix FROM MomoaIntegrationBundle:sources\Common c INNER JOIN (SELECT AVG(subC.prix) as AMEAN FROM MomoaIntegrationBundle:sources\Common subC) AS aggregates
获取此奇怪错误:第0行,第70列靠近“(选择平均值(subC.prix)”:错误:类“(”未定义。
编辑3:
我找到了一种鹰派的方法使其发挥作用,但该理论对实体的实现是顽固的,并且忘记了统计不需要实体
$subQb = $this->_em->createQueryBuilder();
$subQb->addSelect("AVG(subC.prix) as AMEAN")
->from("MomoaIntegrationBundle:sources\Common", "subC");
$sql = "SELECT (c.prix-aggregates.sclr_0) AS test FROM immobilier_ad_blank c CROSS JOIN "
. "({$subQb->getQuery()->getSQL()}) AS aggregates";
$stm = $stm = $this->_em->getConnection()->prepare($sql);
$stm->execute();
$data = $stm->fetchAll();
<>如果你有更好的解决方案,我洗耳恭听!我实际上不喜欢这个解决方案。< > P> >你可能会考虑绕过DQL和使用本地查询——尤其是因为你不需要在实体中产生结果。
$connection = $em->getConnection();
$statement = $connection->prepare("
select c.prix-aggregates, t1.avg
from immobilier_ad_blank
cross join (
select avg(prix) as avg
from immobilier_ad_blank
) t1
");
$statement->execute();
$results = $statement->fetchAll();
从第2.4条开始,可以在不使用定义关联的情况下加入,例如:
SELECT u FROM User u JOIN Items i WITH u.age = i.price
这个没有任何意义,但你明白了。在这种情况下,WITH
关键字是绝对必需的,否则它是一个语法错误,但你可以只提供一个伪条件,如下所示:
SELECT u FROM User u JOIN Items i WITH 0 = 0
这基本上会导致交叉连接。在给定的情况下,这是否是一个好主意是另一个问题,但我遇到过这样的情况,它确实非常有用