2013-05-31 46 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