您的数据库结构有问题!
当涉及到关系数据库时,您必须始终记住一件事:没有一般的或自动的行排序!
我的意思是:您不能依赖查询输出的顺序。问题是:DBMS 优化您的查询,如果您不调用ORDER BY
它,则未定义它将返回行的顺序。(即使它看起来总是相同的顺序,它可能会在升级 DBMS 或仅仅因为一袋大米在中国掉下来而改变)。不要依赖那个!
所以只有一个合乎逻辑的解决方案:表的第三列submissionstate
,自动生成的主键或时间戳。如果您不需要创建时间,请使用主键。
然后你的桌子看起来像:
id | submission_id | state_id
-----------------------------
1 | 4 | 3
2 | 8 | 3
3 | 4 | 2
4 | 6 | 1
5 | 4 | 5
6 | 8 | 0
如果我理解正确,你想要这些结果:
- 如果你寻找
submission_id = 4
你想收到state_id = 5
- 如果你寻找
submission_id = 8
你想收到state_id = 0
- 如果你寻找
submission_id = 6
你想收到state_id = 1
正确的?
解决方案:
因此,当id
给出一个字段时,您要查找的查询是:
SELECT submission_id, state_id
FROM submissionstates ss
JOIN (
SELECT MAX(id) as id
FROM submissionstates ss
GROUP BY submission_id
) x
ON ss.id = x.id
如果您只想要当前 state_id = 0 的行,则:
SELECT submission_id, state_id
FROM submissionstates ss
JOIN (
SELECT MAX(id) as id
FROM submissionstates ss
GROUP BY submission_id
) x
ON ss.id = x.id
WHERE state_id = 0
如果您已经有 created_at 列,请使用它而不是 id 列:
SELECT submission_id, state_id
FROM submissionstates ss
JOIN (
SELECT MAX(created_at) as created_at
FROM submissionstates ss
GROUP BY submission_id
) x
ON ss.created_at = x.created_at
WHERE state_id = 0