复杂查询与doctrine连接

时间:2016-01-04 22:00:51

标签: php mysql symfony doctrine-orm left-join

我构建一个查询以显示包含用户的项目,然后在该项目上显示最高出价。

示例

詹姆斯的Xbox 360。 - 最高出价是55美元。

马里奥的艺术表。 - 最高出价是25美元。

查询

.round-button-circle {
  width: 100%;
  height: 0;
  padding-bottom: 100%;
  border-radius: 50%;
  border: 10px solid #98a1a4;
  overflow: hidden;
  background: transparent; /* Change it to transparent */
  /* remove background-opacity */
  box-shadow: 0 0 3px gray;
}

我有另一个表格出价(一对多的关系)。我不确定如何在加入的同一查询中包含该项目的单个最高出价。

我知道我可以在此查询之后使用函数(关系)运行另一个查询,但我出于优化原因避免这样做。

解决方案

SQL https://stackoverflow.com/a/16538294/75799 - 但在DQL学说中这怎么可能?

3 个答案:

答案 0 :(得分:2)

在这种情况下,您可以将IN与子查询一起使用 我不确定我是否正确理解了您的模型,但我尝试使用QueryBuilder进行查询,并且我相信您会设法使其适用于此示例:

$qb  = $this->_em->createQueryBuilder();
$sub = $qb;

$sub->select('mbi') // max bid item
    ->where('i.id = mbi.id')
    ->leftJoin('mbi.bids', 'b'))
    ->andWhere($qb->expr()->max('b.value'))
    ->getQuery();

$qb = $qb->select('i', 'u')
         ->where($qb->expr()->in('i', $sub->getDQL()))
         ->leftJoin('i.user', 'u');

$query = $qb->getQuery();
return $query->getResult();

答案 1 :(得分:1)

您的SQL查询可能类似于

select i,u
from i
inner join bids u on i.id = u.item_id
WHERE
    i.value = (select max(value) from bids     where item_id = i.id)
group by i

DQL,我不认为支持子查询,因此您可以尝试使用Having子句或查看Doctrine\ORM\Query\Expr是否提供任何内容。

为了解决这个问题,我在原始实体(项目)中添加了一个方法,使用Doctrine的集合'来查找实体列表中的最大实体(出价)。 Criteria我已经写过here

您的Item实体将包含

public function getMaxBid()
{
   $criteria = Criteria::create();
   $criteria->orderBy(['bid.value' => Criteria::ASC]);
   $criteria->setLimit(1);

   return $this->bids->matching($criteria);
}

答案 2 :(得分:0)

不幸的是, i 无法通过一个分组查询找到最高出价出价者,但有几种技巧使逻辑与多个查询一起工作。您可以执行子选择,这可能会正常工作,具体取决于表的大小。如果您计划成长到不能发挥作用的程度,那么您可能已经在考虑共享关系数据库,将一些数据转移到事务性较低,性能较高的数据库技术,或者非规范化,但是如果你想在纯MySQL中实现这一点,你可以使用一个程序在多个命令中表达如何检查出价并可选择添加到列表中,同时在非规范化高出价表中更新当前的高出价者。这保留了如何在一个最严格管理的地方 - 数据库中验证出价的复杂逻辑。只需确保正确使用交易以阻止同时记录2个出价(例如,选择更新)。

我曾经问过未来的程序员写这个查询,看看他们对MySQL有多么有经验,很多人认为最大分组就足够了,还有一些人离开了采访仍然确信它能正常工作并且 i < / em>错了。这么好的问题!