On this question我收到了一个效果很好的答案。我现在想知道是否有更好的结构。
我有两张桌子。
Projects : id, title
Status : project_id, status_id, created(DATETIME)
目前,为了获取项目的状态,我获取了项目ID,并根据项目ID从状态表中提取最新的行。获得这一最新行非常麻烦。
我是否应该将架构更改为此?
Projects : id, title, current_status_id(FK)
Status : id(PK), project_id, status_id, created(DATETIME)
然后我可以和FK一起加入表格并获取我想要的行而不需要查找最新的行?
编辑:
所以我想要这样的东西
SELECT * FROM projects
LEFT JOIN status on projects.id = status.project_id
WHERE projects.id = 1
但我只想要状态表中的最新记录。
编辑2 :
所以我想要这样的东西
SELECT * FROM projects
LEFT JOIN status on projects.id = status.project_id
但是对于返回的每个项目,只从状态获取该project_id的最新状态记录。
答案 0 :(得分:1)
这有什么麻烦?
SELECT project_id, status_id, created
FROM Status
WHERE project_id = the-id
ORDER BY created DESC
LIMIT 1;
或者,如果您需要多个项目的列表:
SELECT a.project_id, a.status_id, a.created
FROM Status a
LEFT JOIN Status b
ON a.project_id = b.project_id
AND b.created > a.created
WHERE a.project_id IN(id1, id2, id3) AND b.project_id IS NULL;
所以,项目数据:
SELECT Projects.*, Status.*
FROM Projects
LEFT JOIN Status
ON Status.project_id = Projects.id
WHERE Projects.id = the-id
ORDER BY Status.created DESC
LIMIT 1;
或者:
SELECT Projects.*, Status.*
FROM Projects
LEFT JOIN Status a
ON a.project_id = Projects.id
LEFT JOIN Status b
ON a.project_id = b.project_id
AND b.created > a.created
WHERE b.project_id IS NULL;
答案 1 :(得分:1)
这是一种方法。
您甚至可能不需要current_status字段作为FK;为什么不只是存储价值?否则你可以进入奇怪的循环引用。
另一种方法是存储状态存档,与项目表分开。每次状态更改时,将当前状态插入存档表,并更改projects.status值。