2015-11-02 61 views
0

我需要幾個小時試圖與學說查詢讀取位置基於距離,但反過來位置(位置實體)的值數據(位置實體)僅針對相應的用戶重複一次(司機實體)。Symfony的學說沒有重複值

位置實體:

  • ID
  • 司機(多對一到司機實體)
  • 緯度
  • 經度
  • 準確性
  • 海拔
  • ....

司機實體:

  • ID
  • 電子郵件
  • ....

我當前的代碼:

$Locations = $entityManager 
     ->getRepository("MYBUNDLE:Location") 
     ->createQueryBuilder('s') 
     ->leftJoin("s.chauffeur", "chauffeur") 
     ->select('s') 
     ->addSelect(
      '(3959 * acos(cos(radians(' . $location_lat . '))' . 
       '* cos(radians(s.latitude))' . 
       '* cos(radians(s.longitude)' . 
       '- radians(' . $location_lng . '))' . 
       '+ sin(radians(' . $location_lat . '))' . 
       '* sin(radians(s.latitude)))) as distance' 
     ) 
     ->having('distance < :distance') 
     ->setParameter('distance', 10) 
     ->orderBy('distance', 'ASC') 

     // up to this line it works fine 

     //->select('s.chauffeur,count(s.1) as cnt') // 
     //->groupBy('s.chauffeur')     // Filter to see only one Location per Chauffeur 
     //->having('s.count(1) > 1');     // 

我的選擇結果:

  • 第一個結果:

    • ID:1
    • 司機:10(ID)
    • 緯度:-34.894336
    • 經度:-56.152603
    • 精度:20.0
    • 高度:20
  • 第二結果:

    • ID:2
    • 司機:15(ID)
    • 緯度:-34.917782
    • 經度:-56.164569
    • 精度:20.0
    • 高度:20
  • 第三結果:

    • ID:3
    • 司機:10(ID)
    • 緯度:-34。902652
    • 經度:-56.147251
    • 精度:20.0
    • 海拔:20
  • ...

什麼應該發生的是,ID 3的位置被省略,因爲還有另一個位置(ID 1)爲同一用戶(司機實體)

我感謝您的幫助, 個問候,

+0

所有你需要做的是通過你的查詢並增加集團 – Adish

+0

@Adish是的,我已經試過,但我不工作: ( – Gabriel

+0

爲什麼ID3被省略?是因爲ID1

回答

0

此代碼將返回所有Chauffer超過1個地點:

->select('s.chauffeur,count(s.1) as cnt') // 
->groupBy('s.chauffeur')     // Filter to see only one Location per Chauffeur 
->having('s.count(1) > 1');     // 

你想返回一個地方Chauffer是closser。假設您在Location表中有距離,或者您可以使用函數進行計算。

SELECT id, Chauffer, f_distance(location_lat, $location_lng) as distance 
FROM Location 

第一種情況,距離已經在Location

這將返回每個Chauffer距離最小的位置。請注意,如果具有相同距離的多個位置,這可以返回多行。

SELECT L.chauffeur, L.latitude, L.longitude L,accuracy, L.altitude, L.distance 
FROM Location L 
WHERE L.distance = (SELECT MIN(distance) 
        FROM Location M 
        WHERE M.chauffeur = L.chauffeur) 

您可以添加其他地方選擇最小的ID

AND NOT EXISTS (SELECT 1 
       FROM Location M 
       WHERE M.id > L.id 
        AND M.distance = L.distance