我有两个表,applications
和 applicationRevisions
,结构如下:
applications (id, time, user, views)
applicationRevisions(id, application, time, user, name, description)
后者保存应用程序页面的“修订版”,包含标题和描述,因此它是一对多关系。显示应用程序页面时,将选择具有匹配的 application
ID 的最新 applicationRevisions
行。
但是,我无法知道在任何特定时间是否存在具有特定名称的应用程序,因为以前的修订版可能具有不同的名称,并且该名称不会存储在 applications
表中。
我有一个解决方法;将当前名称存储为 applications
中的字段,编辑应用程序时,像往常一样将该行添加到 applicationRevisions
中,但随后更新名称
在applications
行中。
有更好的方法吗?
最佳答案
因此,您希望在其中搜索名称来获取应用程序,然后获取该应用程序的最新版本,该应用程序可能不再具有该名称。对于子查询来说这当然是可能的,但是对于某些修订版碰巧具有相同名称的应用程序,您打算怎么办?
如果应用程序表可以保存名称和描述,就会更加清晰。老实说,这可能只是一个表,因为应用程序中的时间和用户可能与每个应用程序的第一个修订版所使用的时间和用户相同。仅留下 View 字段,该字段可能位于仅包含 applications_views(应用程序、 View )
的表中。
无论如何,如果您想避免对架构进行重大更改并且应用程序之间的名称混淆是可以的,您可以进行如下查询:
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”的每个应用程序的最新版本中的所有字段。
关于MySQL 有趣的搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3948553/