2012-12-17 131 views
0

我有一個基於學說的應用程序,我想從兩個單獨的表中選擇行並按創​​建日期排序。我(在某種程度上)實現這種方式現在:Mixing LEFT JOIN結果MySQL Doctrine

$query = $em->createQueryBuilder() 
    ->from('Embed', 'e') 
    ->select("e") 
    ->leftJoin("User", "u", "WITH", "e.uid=u.id") 
    ->leftJoin("Product", "p", "WITH", "e.pid=p.id") 
    ->where("u.image > 0 OR p.image > 0") 
    ->addOrderBy("u.timeCreated + p.timeCreated", "DESC") 
    ->setMaxResults(28) 
    ->getQuery(); 

我想對於產品和用戶數據進行混合,通過創建日期排序,但排序不正確。我也嘗試使用兩個addOrderBy語句,它們可以正確地爲用戶和產品定購,但將所有用戶放在結果中,而不是混合它們。

編輯:入佛門爵士有正確的方法 - 這裏的工作代碼:

$query = $em->createQueryBuilder() 
    ->from('Embed', 'e') 
    ->select("e") 
    ->leftJoin("User", "u", "WITH", "e.uid=u.id") 
    ->leftJoin("Product", "p", "WITH", "e.pid=p.id") 
    ->addSelect('COALESCE(u.timeCreated, p.timeCreated) as timeCreated') 
    ->where("u.image > 0 OR p.image > 0") 
    ->orderBy("timeCreated", "DESC") 
    ->setMaxResults(28) 
    ->getQuery(); 

回答

3

你應該試試這個

$query = $em->createQueryBuilder() 
    ->from('Embed', 'e') 
    ->select("e") 
    ->leftJoin("User", "u", "WITH", "e.uid=u.id") 
    ->leftJoin("Product", "p", "WITH", "e.pid=p.id") 
    ->where("u.image > 0 OR p.image > 0") 
    ->addOrderBy("COALESCE(u.timeCreated, p.timeCreated)", "DESC") 
    ->setMaxResults(28) 
    ->getQuery(); 
+0

教義的QueryBuilder的拋出異常,但我會盡量找沒有使用QB的合併COALESCE的解決方法。 – CaptainStiggz

+0

恕我直言u.timeCreated或p.timeCreated其中之一將始終爲NULL。添加兩者都會導致NULL。也許IFNULL應該工作,而不是COALESCE –

+0

是的,這是正確的。我認爲COALESCE/IFNULL是正確的做法...現在在教條中實施... – CaptainStiggz