2013-05-31 47 views
0

最大ň我需要建立推進的查詢,可以得到最新的購買客戶機的的Propel 1.6

請在您的回答這些表/列名:

  • 顧客:ID,名稱
  • 購買:身份證,CUSTOMER_ID,日期

從這個問題在這裏SQL join: selecting the last records in a one-to-many relationship

我需要建立推進基於查詢的其中一個查詢:

SELECT c.*, p1.* 
FROM customer c 
JOIN purchase p1 ON (c.id = p1.customer_id) 
LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND 
    (p1.date < p2.date OR p1.date = p2.date AND p1.id < p2.id)) 
WHERE p2.id IS NULL; 

SELECT c.*, p.* 
FROM customer c INNER JOIN 
     (
      SELECT customer_id, 
        MAX(date) MaxDate 
      FROM purchase 
      GROUP BY customer_id 
     ) MaxDates ON c.id = MaxDates.customer_id INNER JOIN 
     purchase p ON MaxDates.customer_id = p.customer_id 
        AND MaxDates.MaxDate = p.date 
+0

你能告訴我們有什麼你嘗試過? – j0k

+0

是的,但現在沒有。發現這個h TTP://stackoverflow.com/questions/2111384/sql-join-selecting-the-last-records-in-a-one-to-many-relationship 但我無法將它推動查詢 – petkopara

回答

0

好吧,給你的問題只是(找到一個給定的客戶端最新的採購),那麼你想要在日期訂購上進行搜索並將其限制爲一個:

$lastPurchase = PurchaseQuery::create() 
    ->filterByCustomerId($customerId) 
    ->orderByDate(Criteria::DESC) 
    ->limit(1) 
    ->find(); 

然而,您鏈接到的答案是查找所有客戶和他們的最新購買。在這種情況下,我可能會使用一個自定義的SQL查詢(儘管你在技術上可以用Propel函數做到這一點,但它會更困難,並且不會讓你變得非常困難,因爲你不會爲對象提供保溼功能(至少不容易)。

UPDATE 這裏有doing a manual query一些信息請注意,這樣做時,返回的數據將不會行走的對象,但如果需要,你可以做on-demand hydration

例:

$sql = "SELECT c.*, p1.* 
     FROM customer c 
     JOIN purchase p1 ON (c.id = p1.customer_id) 
     LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND 
      (p1.date < p2.date OR p1.date = p2.date AND p1.id < p2.id)) 
     WHERE p2.id IS NULL;"; 
$conn = Propel::getConnection(CustomerPeer::DATABASE_NAME); 
$stmt = $conn->prepare($query); 
if ($stmt->execute()) { 
    while($result = $stmt->fetch()) { 
     $someField = $result['...']; 
    } 
} 
+0

我需要即使沒有購買,也能獲得所有客戶。 – petkopara

+0

好的,可能想用這些信息來更新問題(我看到你添加了示例SQL查詢,但它有助於瞭解你想要的返回數據)。此外,我的建議仍然是,你應該在手動查詢中做到這一點(我會在答案中添加更多信息)。 – jakerella