2011-10-10 80 views
2

考虑以下MySQL表:的MySQL JOIN和日期比较/操作


应用(包含所有应用程序的所有用户)

unique_id | user_id | date_of_application | date_ended | status 
---------------------------------------------------------------------------- 
1   user_a   2010-09-09   2010-12-24  Ended 
2   user_a   2011-03-03   2011-06-06  Ended 
3   user_a   2011-08-08   2011-10-10  Ended 
4   user_b   2011-10-01       Active 


* ITEM_TRANSACTIONS *(包含所有用户的所有项目交易)

user_id | item_id | quantity_ordered | date_requested | date_received 
---------------------------------------------------------------------------- 
user_a  item_a   20    2011-10-01   2011-10-02 
user_a  item_b   10    2011-10-01   2011-10-02 
user_b  item_a   30    2011-10-05   2011-10-10 
user_b  item_b   30    2011-10-05   2011-10-10 


ITEMS

item_id | item_name | item_price 
------------------------------------ 
item_a  Item AA   500 
item_b  Item BB   1000 


到目前为止,我有以下查询已经采取的项目价格独特%的值的总和用户

不过,我需要什么,除了这是SELECT应该只涵盖那些项目交易其用户的状态有所截至的(计算的总和)和应用作为最新之一。

要重申一下,应用item_transactions表将随着时间的推移相同的用户,应该怎样盖(选中)包含几个记录是最新的应用下,这些交易只(状态截止)。


SELECT 
    item_po.poid, 
    SUM(item_transactions.quantity_ordered) AS qtysum, 
    item_transactions.item_id, 
    item_transactions.quantity_ordered, 

    items.item_id, 
    items.item_price, 

    applications.user_id, 
    applications.status 

FROM 
    items 

WHERE 
    applications.status='Ended' 

GROUP BY 
    item_transactions.user_id 
+0

+1表示格式。但是你没有告诉我们你的查询的一般目的。你能否在每天的语言中描述它的作用和结果? –

+0

你能否告诉我你想要的预期结果? –

+0

@ErwinBrandstetter嗯,我应该如何把这个...也许这就像说我想根据提供的日期参数(在我的情况下是date_of_application和date_ended)计算给定公司的销售额。同时考虑到只有最新的应用应该被考虑。在我的情况下,user_b因为他的状态此刻处于活动状态而不在等式中。呃我希望能够说清楚= P –

回答

0

要为每个用户只选择最后端的应用程序,你可以使用子查询选择那些应用程序的ID,并与子查询加盟申请表。假设应用程序ID按时间顺序排列:

SELECT 
    item_po.poid, 
    SUM(item_transactions.quantity_ordered) AS qtysum, 
    item_transactions.item_id, 
    item_transactions.quantity_ordered, 
    items.item_id, 
    items.item_price, 
    applications.user_id, 
    applications.status 
FROM 
    applications 
    NATURAL JOIN (
    SELECT 
     MAX(unique_id) AS unique_id 
    FROM applications 
    WHERE status = 'Ended' 
    GROUP BY user_id 
) AS foo 
    /* ... other joins here ... */ 

但是,我无法从你的描述找出交易应该究竟如何被连接到应用程序。我假设你可能想是这样的:

JOIN item_transactions 
    ON date_requested BETWEEN date_of_application AND date_ended 
    NATURAL JOIN items 

,但我不知道确切的连接标准。 (例如,如果该项目在申请期间被要求但在其结束后交付或者在申请期间之前要求但是在申请期间交付了该怎么办?)

0

你可以试试这个。

SELECT 

    SUM(Tran.quantity_ordered) AS qtysum, 
    Tran.item_id, 
    Tran.quantity_ordered, 

    I.item_id, 
    I.item_price, 

    A.user_id, 
    A.status 

FROM 
    items as I,applications as A, item_transactions AS Tran 

WHERE 
    A.status='Ended' 

GROUP BY 
    Tran.user_id 

    ORDER BY A.unique_id DESC 

LIMIT 0,1 

如果你正在寻找只有一个最新的记录,那么你需要使用限制0,1否则其不that..i工作认为这将是对您有所帮助。

谢谢。

0

怎么样,如果你试试这个:

SELECT 
    item_po.poid, 
    SUM(item_transactions.quantity_ordered) AS qtysum, 
    item_transactions.item_id, 
    item_transactions.quantity_ordered, 

    items.item_id, 
    items.item_price, 

    applications.user_id, 
    applications.status 

FROM 
    items 

WHERE 
    applications.status='Ended' 
AND applications.date_of_application = (SELECT MAX(date_of_application) FROM applications 
WHERE status='Ended' LIMIT 0, 1) 

GROUP BY 
    item_transactions.user_id 

既然你需要最新的应用程序,你应该得到的所有端应用时,它没有结束,不管的最新日期,但我有怀疑此声明“其用户的状态已终止,并且该应用程序是最新的。”因为我认为你可能会说,一旦交易结束了,会将交易转变为最新交易,无论何时开始存在于记录中,如果是这种情况,而不是使用date_of_application属性,则可能以某种方式使用date_ended代替。

我希望这会有所帮助。

:)