MySQL选择一个具有唯一属性值的行
我正在建立一个库存系统,并决定在每次更新到下表时存储每个产品的余额: +------+-------+-----+---+ |产品编号|仓库编号|余额|日期| +------+-------+-----+---+ 例如: 员工在仓库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 | +------+-------+-----+-------+ 简言之,我需要最新的日期行,每个产品的idMySQL选择一个具有唯一属性值的行,mysql,sql,database,Mysql,Sql,Database,我正在建立一个库存系统,并决定在每次更新到下表时存储每个产品的余额: +------+-------+-----+---+ |产品编号|仓库编号|余额|日期| +------+-------+-----+---+ 例如: 员工在仓库id 5的产品id 123上添加10件 +------+-------+-----+-------+ |产品编号|仓库编号|余额|日期| +------+-------+-----+-------+ | 123 | 5 | 10
任何帮助都将不胜感激 假设每个仓库都有产品余额,您可以这样做
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)