【问题标题】:MySQL JOIN and DATE comparison/manipulationMySQL JOIN 和 DATE 比较/操作
【发布时间】:2011-12-04 05:35:37
【问题描述】:

考虑以下 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 仅涵盖(计算总和)其用户状态为 Ended 的那些 item transactions 并且应用程序是最新的应用程序。

重申一下,applicationsitem_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

【问题讨论】:

  • +1 表示示例格式。但是您没有告诉我们您查询的一般目的。你能用日常语言描述它的用途和结果吗?
  • 能否告诉我您想要的预期结果。
  • @ErwinBrandstetter 嗯,我该怎么说......也许这就像说我想根据提供的日期参数(在我的例子中是 date_of_application 和 date_ended)计算给定公司的销售额。还要考虑到只应考虑最新的应用程序。在我的情况下, user_b 不在等式中,因为他的状态目前是活动的。呃,我希望能说清楚=P
  • @Arif 我虽然得到了覆盖 =P 无论如何,根据上面的表格,我想做的应该给我:(价格总和和数量总和所有项目)由(其应用程序状态为“已结束”的用户)和(那些 item_transactions 发生在该特定应用程序范围内) .我已经使用发布的查询介绍了第一个。此外(我们应该只计算同一个 raiser 的最新/最后一个应用程序
  • 你好,** item_po.poid **在哪里?你这里没有详细的** item_po **表...请解释一下。

标签: php mysql sql join phpmyadmin


【解决方案1】:

要仅为每个用户选择最后结束的应用程序,您可以使用子查询来选择这些应用程序的 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

但我不确定确切的加入标准。 (比如,申请期间申请了,申请结束后送达了怎么办?或者申请期间之前申请了,申请期间送达了怎么办?)

【讨论】:

    【解决方案2】:

    你可以试试这个。

    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 否则它在没有它的情况下工作..我认为这会对您有所帮助。

    谢谢。

    【讨论】:

      【解决方案3】:

      如果你试试这个怎么样:

      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_ended 属性,而不是使用 date_of_application 属性。而是。

      我希望这会有所帮助。

      :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多