Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 交叉连接到DQL_Php_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

Php 交叉连接到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分数。 最初的实现来自这个问题 我考虑过在实体中创建一个关联,但我的意思是它

我正在尝试将这个我认为简单的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分数。 最初的实现来自这个问题

我考虑过在实体中创建一个关联,但我的意思是它不是必需的,它只是用于统计

编辑:顺便说一句,我不想使用原始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
这基本上会导致交叉连接。在给定的情况下,这是否是一个好主意是另一个问题,但我遇到过这样的情况,它确实非常有用