【问题标题】:MySQL Query Help - Inventory SystemMySQL 查询帮助 - 库存系统
【发布时间】:2016-01-18 14:21:26
【问题描述】:

我花了很长时间弄清楚如何编写这个查询,我希望有人能指出我正确的方向。

我有一个管理资产的系统,并且有两个与此问题相关的表格。 item,对于持有的每个资产都有一个记录,然后 item_activity 存储每次要签入或签出存储区域的项目时的记录。

我需要生成在某个日期范围内的任何时间点持有的物品的报告(即我们的存储在一年中看到了多少物品)。换句话说,我需要查看一年内存储在仓库中的所有物品,无论它们在那里存放了多长时间(签入状态)。查看我的活动表并查找某个日期范围内的签到状态很容易。我遇到的问题是捕获在我的日期范围开始之前签入并且在那一年根本没有移动的项目。

这是我的架构

项目

  • id(主键)
  • 制作
  • 型号
  • 序列号
  • 类型
  • 价值
  • 等等……

item_activity

  • activity_id
  • item_id(与项目表相关)
  • 状态(签入、签出、分配等)
  • 时间戳
  • 用户
  • 注释

我确定之前有人遇到过这种情况,但我似乎找不到任何以前的问题,或者可能不知道用来定位问题的正确词语。感谢您的帮助!我对 SQL 很陌生。

【问题讨论】:

  • 您能否详细说明需要报告的内容?我无法理解。
  • 因此,您希望所有物品每年至少存储一次,无论它们是全年可用、连续两周还是每隔一个月可用。是吗?
  • 正确@ThorstenKettner。抱歉,我没有很好地解释。

标签: mysql sql


【解决方案1】:

所有活动......

SELECT * 
FROM Item_Activity A
INNER JOIN Item I ON I.id = A.Item_ID
WHERE
   A.timestamp BETWEEN @YourStartDate AND @YourEndDate;

在指定的 2 个日期之间有活动的所有项目......

SELECT I.* 
FROM Item I
INNER JOIN Item_Activity A ON I.id = A.Item_ID
WHERE
   A.timestamp BETWEEN @YourStartDate AND @YourEndDate;

【讨论】:

    【解决方案2】:

    您找到了那些在当年发生了动作的项目是对的。很简单:

    select distinct item_id
    from item_activity
    where status in ('Checked In', 'Checked out')
    and year(timestmp) = 2015;
    

    因此,我们错过了那些在 2015 年之前签入但之后未签出的项目(即 2015 年之前的最后一次操作是签入)。

    select item_id
    from
    (
      select item_id, status
      from item_activity
      where status in ('Checked In', 'Checked out')
      and year(timestmp) < 2015
      order by timestmp desc limit 1 -- latest record before 2015
    ) last_item_action
    where status = 'Checked In'; -- latest action was check-in
    

    两个查询合并:

    select item_id
    from item_activity
    where status in ('Checked In', 'Checked out')
    and year(timestmp) = 2015
    union
    select item_id
    from
    (
      select item_id, status
      from item_activity
      where status in ('Checked In', 'Checked out')
      and year(timestmp) < 2015
      order by timestmp desc limit 1
    ) last_item_action
    where status = 'Checked In';
    

    (在这个组合查询中,您甚至可以将第一个查询限制为where status = 'Checked In',因为我们不再关心这里的结帐。这只是针对 2015 年之前签入的项目,我们现在发现第二个查询。)

    【讨论】: