考虑以下 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
到目前为止,我有以下查询,该查询已经对 distinct per user 的商品价格值求和。
但是,除此之外我还需要的是 SELECT 应该只涵盖(计算总和)那些用户状态为Ended 的item transactions 并且申请是最新的。
重申一下,applications 和 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
最佳答案
要仅为每个用户选择最后结束的应用程序,您可以使用子查询来选择这些应用程序的 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
但我不确定确切的加入条件。 (例如,如果项目在申请期间请求但在结束后交付?或者在申请期间之前请求但在申请期间交付怎么办?)
关于php - MySQL JOIN 和 DATE 比较/操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7708339/