gpt4 book ai didi

php - 交叉连接到 DQL

转载 作者:可可西里 更新时间:2023-11-01 07:44:15 27 4
gpt4 key购买 nike

我正在尝试将这个我认为简单的 mysql 查询转换为 Doctrine 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 分数。来自这个问题的原始实现 Calculating Z-Score for each row in MySQL? (simple)

我考虑过在实体内创建一个关联,但我的意思是它没有必要,它仅用于统计。

编辑:顺便说一句,我不想​​使用原始 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 列靠近“(SELECT AVG(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();

如果您有更好的解决方案,我会洗耳恭听!我实际上不喜欢这个解决方案。

最佳答案

对于复杂的查询,您可能需要考虑绕过 DQL 并使用 native 查询 - 特别是因为您不需要实体中的结果。

$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();

关于php - 交叉连接到 DQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31766505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com