###Doctrine 2 で下記のSQL文を実現したい。
商品ごとに毎日の売上数が保存されているテーブル
MySQL
1CREATE TABLE IF NOT EXISTS `sales` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `item_id` int(11) NOT NULL, 4 `date` date NOT NULL, 5 `value` int(11) NOT NULL DEFAULT '0', 6 PRIMARY KEY (`id`), 7 UNIQUE(`item_id`, `date`) 8) ENGINE=InnoDB DEFAULT CHARSET=utf8;
任意の日付で参照した時その日付以前の累計値も参照したい。
MySQL
1SET @today = '任意の日付'; 2SELECT 3 a.*, b.`total` 4FROM 5 `sales` a 6INNER JOIN 7 ( 8 SELECT 9 `item_id`, SUM(`value`) AS `total` 10 FROM 11 `sales` 12 WHERE 13 `date` <= @today 14 GROUP BY 15 `item_id` 16 ) b 17ON 18 b.`item_id` = a.`item_id` 19WHERE 20 a.`date` = @today;
###試したこと
PHP
1/** 2 * 3 * @param Doctrine\ORM\EntityManager $em 4 * @param \DateTime $date 5 */ 6 7$qb1 = $em->createQueryBuilder(); 8$qb2 = clone $qb1; 9 10$qb1->from('Application\Entity\Sales', 'a') 11 ->select('a') 12 ->andWhere($qb1->expr()->eq('a.date', ':date')); 13 14$qb2->from('Application\Entity\Sales', 'b') 15 ->select('b.itemId, SUM(b.value) AS total') 16 ->andWhere($qb1->expr()->lte('b.date', ':date')) 17 ->addGroupBy('b.itemId'); 18 19$qb1->addSelect('b.total') 20 ->innerJoin(sprintf('(%s)', $qb2->getDQL()), 'b', Doctrine\ORM\Query\Expr\Join::WITH, $qb1->expr()->eq('b.itemId', 'a.itemId')) 21 ->setParameter('date', $date); 22 23$results = $qb1->getQuery()->getResult();
$qb1, $qb2 を innerJoin する前ソースコードに setParameter を設定して結果を確認すると問題はないので Entity には問題ないです。
エラーメッセージが出力しているクエリ文は理想に近い形なのですが
innerJoin にサブクエリは使えないのでしょうか?
または他のやり方があるのでしょうか?
###発生している問題・エラーメッセージ
Additional information: Doctrine\ORM\Query\QueryException File: /vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:63 Message: [Semantical Error] line 0, col 69 near '(SELECT b.itemId,': Error: Class '(' is not defined. Previous exceptions: Doctrine\ORM\Query\QueryException File: /vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:41 Message: SELECT a, b.total FROM Application\Entity\Sales a INNER JOIN (SELECT b.itemId, SUM(b.value) AS total FROM Application\Entity\Sales b WHERE b.date <= :date GROUP BY b.itemId) b WITH b.itemId = a.itemId WHERE a.date = :date
###解決した記述
php
1$qb1 = $em->createQueryBuilder(); 2$qb2 = clone $qb1; 3 4$qb2->from('Application\Entity\Sales', 'b') 5 ->select('SUM(b.value)') 6 ->andWhere($qb2->expr()->lte('b.date', ':date')) 7 ->andWhere($qb2->expr()->eq('b.itemId', 'a.itemId')); 8 9$qb1->from('Application\Entity\Sales', 'a') 10 ->select('a') 11 ->addSelect(sprintf('(%s) AS total', $qb2->getDQL())) 12 ->andWhere($qb1->expr()->eq('a.date', ':date')) 13 ->setParameter('date', $date); 14 15$results = $qb1->getQuery()->getResult();
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/10/06 07:58
退会済みユーザー
2016/10/06 08:19