2017-08-16 76 views
0

我不想做任何特殊的魔术,只需将我的查询加入子查询。我已经尝试了很多在互联网上找到的方法和技巧,但没有人能够工作,而且我总是收到无用的错误消息,这些消息告诉我们对问题有意义或者没有意义寻找解决方案。如何在教条中左加入子SELECT

这里是我的子查询和查询:

$subQuery = $qb 
      ->select("DISTINCT TRIM(cp.originalteilenummer) AS productCode") 
      ->from(\Vendor\ShopBundle\Entity\ExternalProduct::class, 'cp') 
      ->getQuery(); 


$result = self::$entityManager->createQueryBuilder() 
      ->select('c.id, 
         c.manufacturerId, 
         cu.fullName, 
         c.vin, 
         c.plateNumber, 
         c.netDiscountPrice, 
         c.calculationDate, 
         u.loginName, 
         c.lastOfferSentAt, 
         COUNT(DISTINCT i.id) AS items, 
         c.customerDmsId, 
         GROUP_CONCAT(cp.productCode) AS productCodes') 
      ->from(\Vendor\ShopBundle\Entity\Calculation::class, 'c') 
      ->innerJoin(\Vendor\ShopBundle\Entity\CalculationItem::class, 'i', 'WITH', 'c.id = i.orderId') 
      ->leftJoin(\Vendor\UserBundle\Entity\User::class, 'u', 'WITH', 'c.openedBy = u.id') 
      ->leftJoin(\Vendor\CoreBundle\Entity\User::class, 'cu', 'WITH', 'c.customerDmsId = cu.user') 
      ->leftJoin(sprintf('(%s)', $subQuery->getSQL()), 'cp', 'WITH', 'i.partNumber = cp.productCode') 
      ->groupBy('c.id') 
      ->getQuery() 
      ->getScalarResult(); 

我只是想离开加入我的查询子查询的数据集。我怎么能做到这一点?

如果我跑,我得到一个错误:你正在尝试做的

[Semantical Error] line 0, col 773 near '(SELECT DISTINCT': Error: Class '(' is not defined.

+0

@Veve是的,它工作得很好 – ACs

+0

花点时间学习的DQL(不SQL)联接语法。提示:leftJoin(c.openBy','u')是你所需要的。获取基础知识,然后专注于您的子查询。 – Cerad

+0

@Cerad没有子查询基本查询正常工作。正如你所说的离开加盟(c.openBy','u')就足够了,但只有当'c'和'u'之间有联系时,但在这种情况下并不存在。使用我使用的语法,可以通过给定的条件连接两个'不相关'的实体。所以问题仍然是这个学说绝对期望一个实体类在我想要传递子查询的地步。 – ACs

回答

0

这应该工作,你正试图把getSQL()改用getDQL()

->leftJoin(sprintf('(%s)', $subQuery->getSQL()), 'cp', 'WITH', 'i.partNumber = cp.productCode') 
当然

->leftJoin('VendorShopBundle:ExternalProduct', 'cp', 'WITH', $qb->expr()->eq('i.partNumber', '('.$subQuery->getDQL().')'))