MySQL选择一个具有唯一属性值的行

MySQL选择一个具有唯一属性值的行,mysql,sql,database,Mysql,Sql,Database,我正在建立一个库存系统,并决定在每次更新到下表时存储每个产品的余额: +------+-------+-----+---+ |产品编号|仓库编号|余额|日期| +------+-------+-----+---+ 例如: 员工在仓库id 5的产品id 123上添加10件 +------+-------+-----+-------+ |产品编号|仓库编号|余额|日期| +------+-------+-----+-------+ | 123 | 5 | 10

我正在建立一个库存系统,并决定在每次更新到下表时存储每个产品的余额:

+------+-------+-----+---+ |产品编号|仓库编号|余额|日期| +------+-------+-----+---+ 例如:

员工在仓库id 5的产品id 123上添加10件

+------+-------+-----+-------+ |产品编号|仓库编号|余额|日期| +------+-------+-----+-------+ | 123 | 5 | 10 | 2013-09-16 | +------+-------+-----+-------+ 然后,员工将3件添加到仓库id 5中的产品234中,然后 5件至123件,仓库编号5

+------+-------+-----+-------+ |产品编号|仓库编号|余额|日期| +------+-------+-----+-------+ | 123 | 5 | 10 | 2013-09-16 | | 234 | 5 | 3 | 2013-09-18 | | 123 | 5 | 15 | 2013-09-21 | +------+-------+-----+-------+ *请注意日期列

现在让我再添加几行

+------+-------+-----+-------+ |产品编号|仓库编号|余额|日期| +------+-------+-----+-------+ | 123 | 5 | 10 | 2013-09-16 | | 234 | 5 | 3 | 2013-09-18 | | 123 | 5 | 15 | 2013-09-21 | | 123 | 5 | 18 | 2013-09-24 | | 234 | 5 | 10 | 2013-09-26 | | 123 | 5 | 22 | 2013-09-29 | +------+-------+-----+-------+ 如何运行查询,以获取截至2013年9月25日的所有产品余额

这意味着我需要以下结果:

+------+-------+-----+-------+ |产品编号|仓库编号|余额|日期| +------+-------+-----+-------+ | 234 | 5 | 3 | 2013-09-18 | | 123 | 5 | 18 | 2013-09-24 | +------+-------+-----+-------+ 简言之,我需要最新的日期行,每个产品的id


任何帮助都将不胜感激

假设每个仓库都有产品余额,您可以这样做

SELECT * 
FROM TABLE 
WHERE (PRODUCT_ID, DATE) IN
     (SELECT PRODUCT_ID, MAX(DATE) FROM TABLE
      WHERE DATE <= '2013-09-25'     
       GROUP BY PRODUCT_ID )
选择t.产品id、t.仓库id、t.余额、t.日期 从表1开始,请不要加入 选择仓库标识、产品标识、最大日期 来自表1 其中日期查询:


为什么需要提及仓库id?@Bere可能需要也可能不需要,这取决于余额的保存方式。OP在这一点上的问题并不清楚。但看起来是这样的,而且按仓库保管也是合乎逻辑的。@peterm,哇,我完全忘了提到可能有多个仓库了!谢谢你指出这一点。查询看起来不错,我会在工作中测试它@彼得,这很有效!不过有一个问题,MySQL中的输出显示了以下列:product\u id warehouse\u id date balance warehouse\u id product\u id date,除了余额之外的所有内容都重复了?@VivekManglani我很高兴我能提供帮助:现在由于选择*,列重复了。你不应该在生产中使用它。而是始终指定要作为结果集的一部分返回的精确列。但是,SELECT*可以用于类似的示例进行调试。我已经更新了答案和sqlfiddle示例。嗨,贾斯汀。在这种情况下,一个产品将得到两个结果。所以我认为您应该添加GROUPBY子句 | PRODUCT_ID | WAREHOUSE_ID | BALANCE | DATE | |------------|--------------|---------|------------| | 234 | 5 | 3 | 2013-09-18 | | 123 | 5 | 18 | 2013-09-24 |
  SELECT *
  FROM table1 t 
  WHERE t.`Date` = (SELECT MAX(t2.`Date`)
                  FROM Table1 t2
                  WHERE t2.`Date` <= '2013-09-25'
                  AND t2.product_id = t.product_id)