考虑以下MySQL表:
APPLICATIONS (包含所有用户的所有应用程序)
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
项
item_id | item_name | item_price
------------------------------------
item_a Item AA 500
item_b Item BB 1000
到目前为止,我有以下查询已经采用项目价格不同用户的值的总和。
然而,除此之外我还需要的是SELECT应该只覆盖(计算总和)那些项目交易,其用户的状态为结束,并且应用程序是最新的。
重申一下,应用程序和 item_transactions 表将包含同一用户随时间推移的多条记录,应涵盖的内容(SELECTED)是最新应用程序下的那些事务(状态结束)仅限。
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 :(得分: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
但我不确定确切的加入标准。 (例如,如果该项目在申请期间被请求但在结束后交付?或者在申请期间提交但是在申请期间交付了该怎么办?)
答案 1 :(得分: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
如果您只查找一条最新记录,那么您需要使用 LIMIT 0,1 ,否则它的工作没有那个......我认为这会对您有所帮助。
感谢。
答案 2 :(得分: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代替。
我希望这会有所帮助。
:)