簡體   English   中英

復雜查詢與學說結合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM