我有两个表,applications和applicationRevisions,它们是结构化的:
applications (id, time, user, views)
applicationRevisions(id, application, time, user, name, description)后者保存应用程序页面的“修订”,包含标题和描述,因此它是一对多关系。显示应用程序页面时,将选择具有匹配application ID的最新applicationRevisions行。
但是,我无法知道某个特定时间是否存在具有某个名称的应用程序,因为以前的修订版本可能具有不同的名称,并且该名称不会存储在applications表中。
我有一个变通办法;将当前名称作为字段存储在applications中,在编辑应用程序时,像往常一样将行添加到applicationRevisions,但随后更新applications行中的name。
有没有更好的方法来做这件事?
发布于 2010-10-16 20:44:55
因此,您想要在中搜索一个名称以获取应用程序,然后获取该应用程序的最新版本,该应用程序可能不再具有该名称。对子查询来说,这当然是可能的,但是对于某些修订恰好具有相同名称的应用程序,您将如何处理呢?
如果应用程序表可以保存名称和描述,则会更清楚。老实说,这可能只是一个表,因为应用程序中的时间和用户可能与每个应用程序的第一个修订版相同。只剩下views字段,它可能只存在于applications_views (application, views)表中。
无论如何,如果您希望避免对模式进行重大更改,并且应用程序之间的名称混淆是可以的,则可以进行如下查询:
select * from applications join applicationRevisions
on (applications.id=applicationRevisions.application)
where applicationRevisions.id in
(select max(id)
from applicationRevisions
where name = 'foobar'
group by application);如果我猜对了关系,这将为您提供使用'foobar‘名称的每个应用程序的最新版本的所有字段。
发布于 2010-10-16 21:10:48
如果我在这里遗漏了什么,请纠正我,每个应用程序条目至少必须有一个applicationRevision,对吗?
为什么不使用外键约束呢?将applicationRevision表的应用程序字段设置为外键。使用id而不是名称来标识应用程序。使名称成为修订的属性。
假设您想搜索一个名为"wxyz“的应用程序,所以您执行一个
select id,application from applicationRevision where name="wxyz" order by time DESC LIMIT 1;这将为您提供应用程序id。您可以执行连接并从单个查询中获取应用程序字段
https://stackoverflow.com/questions/3948553
复制相似问题