[英]Complex query join with doctrine
我正在建立一個查詢以向用戶顯示項目,然后在該項目上顯示最高出價。
范例 :
詹姆斯的Xbox 360。 -最高出價是$ 55。
馬里奧藝術表。 -最高出價是25美元。
詢問
SELECT i, u
FROM AppBundle:Item i
LEFT JOIN i.user u
我有另一個表出價(一對多關系)。 我不確定如何在具有Join的同一查詢中包含該項目的單個最高出價。
我知道我可以在此查詢后使用功能(關系)運行另一個查詢,但是出於優化原因,我避免這樣做。
解
SQL https://stackoverflow.com/a/16538294/75799-但是在DQL學說中怎么可能呢?
在這種情況下,可以將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();
您的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的Collections Criteria
,在原始實體(item)中添加了一種方法,以在實體列表(出價)中找到max實體。
您的Item
實體將包含
public function getMaxBid()
{
$criteria = Criteria::create();
$criteria->orderBy(['bid.value' => Criteria::ASC]);
$criteria->setLimit(1);
return $this->bids->matching($criteria);
}
不幸的是, 我無法通過一個分組查詢來找到最高出價和出價者,但是有幾種技術可以使邏輯處理多個查詢。 您可以進行子選擇,並且可能會很好地工作,具體取決於表的大小。 如果您打算發展到無法正常工作的地步,則可能已經在考慮共享關系數據庫,將一些數據移至事務性較小,性能更高的db技術或進行非規范化,但是如果您希望將此操作保持在純MySQL中,您可以使用一個過程在多個命令中表示如何檢查出價,並有選擇地添加到列表中,還可以在非規范化的最高出價表中更新當前的最高出價者。 這保持了如何在一個最嚴格管理的位置-數據庫中驗證出價的復雜邏輯。 只要確保您正確使用交易記錄即可停止同時記錄2個出價(例如,SELECT FOR UPDATE)。
我曾經要求准程序員編寫此查詢,以了解他們對MySQL的使用經驗,許多人認為僅僅進行最大程度的分組就足夠了,還有一些人離開面試仍然堅信它可以正常工作,而且我錯了。 好問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.