我有一个由库存项目组成的库存表。我具有以下表结构:
INSTALLATION_ID
COMPONENT_ID
HISTORY_ID
ON_STOCK
LAST_CHANGE
对于不存在特定的LAST_CHANGE月的记录,我需要获取具有最大HISTORY ID的行。
每个COMPONENT_ID和INSTALLATION_ID可以多次出现,它们通过各自的HISTORY_ID进行区分
例:
我有以下记录
COMPONENT_ID | INSTALLATION_ID | HISTORY_ID |最后一次变更
1 | 100 | 1 | 2013-01-02
1 | 100 | 2 | 2013-02-01
1 | 100 | 3 | 2013-04-09
2 | 100 | 1 | 2013-02-22
2 | 100 | 2 | 2013-03-12
2 | 100 | 3 | 2013-07-07
2 | 100 | 4 | 2013-08-11
2 | 100 | 5 | 2013-09-15
2 | 100 | 6 | 2013-09-29
3 | 100 | 1 | 2013-02-14
3 | 100 | 2 | 2013-09-23
4 | 100 | 1 | 2013-04-17
我现在尝试检索每个组件具有最大历史ID的行,但仅检索其中不存在指定月份的COMPONENT_ID的行
我尝试了以下方法:
SELECT
INVENTORY.COMPONENT_ID,
INVENTORY.HISTORY_ID
FROM INVENTORY
WHERE INVENTORY.HISTORY_ID = (SELECT
MAX(t2.HISTORY_ID)
FROM INVENTORY t2
WHERE NOT EXISTS
(
SELECT *
FROM INVENTORY t3
WHERE MONTH(t3.LAST_CHANGE) = 9
AND YEAR(t3.LAST_CHANGE)= 2013
AND t3.HISTORY_ID = t2.HISTORY_ID
)
)
AND INVENTORY.INSTALLATION_ID = 200
AND YEAR(INVENTORY.LAST_CHANGE) = 2013
该查询似乎具有正确的语法,但超时。
在这种情况下,我想检索所有组件的最大HISTORY_ID,除了那些在9月有记录的组件。
因为我需要按行月份完全排除行,所以我不能使用NOT IN,因为它们只会隐藏9月的记录,但是同一组件可能在另一个月份出现。
有人可以指点一下吗?非常感谢。
最佳答案
如果我正确理解了您想要的内容,可以这样做
SELECT component_id, MAX(history_id) history_id
FROM inventory
WHERE last_change BETWEEN '2013-01-01' AND '2013-12-31'
AND installation_id = 100
GROUP BY component_id
HAVING MAX(MONTH(last_change) = 9) = 0
输出:
| COMPONENT_ID | HISTORY_ID | |--------------|------------| | 1 | 3 | | 4 | 1 |
If you always filter by installation_id
and a year of last_change
make sure that you have a compound index on (installation_id, last_change)
ALTER TABLE inventory ADD INDEX (installation_id, last_change);
这是SQLFiddle演示
关于mysql - MySQL-在不存在的月份中获取具有最大HISTORY ID的COMPONENT ID的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19320897/