MySQL JOIN和DATE比较/操作

时间:2011-10-10 03:44:16

标签: php mysql sql join phpmyadmin

考虑以下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

3 个答案:

答案 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代替。

我希望这会有所帮助。

:)