2

教義を介して次のクエリを実行しようとしています:

$sql = "SELECT league_id, sum(num_fans) AS total_fans FROM ("
."SELECT COUNT(*) as num_fans, t.id AS team_id, l.id AS league_id FROM fan_link fl "
."JOIN team t ON fl.team_id = t.id JOIN League l ON t.league_id = l.id GROUP BY fl.team_id"
.") a GROUP BY league_id LIMIT 0, 3";

$results = $this->em->createQuery($sql)->getScalarResult();

クエリは PHPMyAdmin では問題なく動作しますが、doctrine で実行しようとすると、次のエラーが発生します。

Doctrine\ORM\Query\QueryException [ 0 ]: 
[Semantical Error] line 0, col 51 near '(SELECT COUNT(*)': 
Error: Class '(' is not defined.

かっこ(は教義クエリの予約文字ですか? where他の節には正常に機能する副選択がありますが、from節のこれは機能したくありません。私は何を間違っていますか?

更新:
クエリ ビルダーを使用してみましたが、同じエラーが発生しました。コード:

$qb = $this->em->createQueryBuilder();
$leagueQuery = $qb->select('league_id, sum(num_fans) AS total_fans')
    ->from("(SELECT count(*) as num_fans, t.id AS team_id, l.id AS league_id "
    ."FROM fan_link fl "
    ."JOIN team t ON fl.team_id = t.id "
    ."JOIN League l ON t.league_id = l.id GROUP BY fl.team_id)",
    'a')
    ->groupBy("league_id")
    ->orderBy("total_fans", "DESC")
    ->setMaxResults(3)
    ->getQuery();

$results = $leagueQuery->getArrayResult();
4

2 に答える 2

0

これが機能している間、何時間も費やしてください!

createNativeQuery()でそれを行うことができます

ここに実際の例があります:

$rsm = new ResultSetMapping();
$rsm->addScalarResult('c1', 'c1');
$rsm->addScalarResult('b1', 'b1');

$qb = $manager->createNativeQuery("
SELECT SUM(RESULTS.totalHours) AS c1, SUM(RESULTS.totalDuration) AS b1
FROM
(
    SELECT S.totalHours, S.totalDuration
    FROM S
    INNER JOIN SV ON S.specificationId = SV.id
    LEFT JOIN SToTagRel ST ON S.id = ST.specificationId
    LEFT JOIN T ON ST.tagId = T.id
    GROUP BY S.id
) AS RESULTS
", $rsm);

$qb->getSingleResult();

于 2016-12-14T16:13:34.720 に答える
0

これを使用して終了しました:

$sql = "SELECT league_id, sum(num_fans) AS total_fans FROM "
    ."(SELECT COUNT(*) as num_fans, t.id AS team_id, l.id AS league_id FROM fan_link fl "
    ."JOIN team t ON fl.team_id = t.id JOIN League l ON t.league_id = l.id GROUP BY fl.team_id"
    .") a GROUP BY league_id LIMIT 0, 3";
$q = $this->em->getConnection();
$league_results = $q->fetchAll($sql);
于 2012-09-23T18:33:37.110 に答える