0

在这个问题上,我收到了一个很好的答案。我现在想知道是否有可能更好的结构。

我有两张桌子。

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

但是对于每个返回的项目,只能从 status 中获取该 project_id 的最新状态记录。

4

2 回答 2

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;
于 2013-03-06T21:01:06.937 回答
1

这是一种方法。

您甚至可能不需要 current_status 字段成为 FK;为什么不只存储价值?否则,您可能会遇到奇怪的循环引用。

另一种方法是存储状态档案,与项目表分开。每次状态更改时,将当前状态插入存档表,并更改 projects.status 值。

于 2013-03-06T21:04:26.067 回答