【问题标题】:Should I create a new field in the table or just select the MAX of the second table我应该在表中创建一个新字段还是只选择第二个表的 MAX
【发布时间】:2013-03-06 20:58:26
【问题描述】:

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

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

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    这是一种方法。

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

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

    【讨论】:

    • 你的第二个选择就是我的意思
    • 使用触发器填充状态历史记录表。那么一般只处理主表。
    【解决方案2】:

    这有多麻烦?

    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;
    

    【讨论】:

    • 那将使用单独的查询。我想加入一个查询以提高速度
    • 不计算?两者都是用于不同目的的单个查询(因此您只需要选择一个),并且“一个查询加入以提高速度”=>我不明白您的意思。
    • 我很想选择项目并在该查询中显示状态。这不是比执行两个查询更快吗?
    • 那么,你的意思是你必须通过其他方式选择项目而不是项目ID?只需将项目表加入其中并添加子句,没什么大不了的?
    • 是的 - 我很确定 OP 打算将此当前状态加入主记录。 (同意不是什么大事)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多