MySQL有趣的搜索

时间:2010-10-16 10:40:56

标签: mysql

我有两个表,applicationsapplicationRevisions,结构化:

applications (id, time, user, views)
applicationRevisions(id, application, time, user, name, description)

后者持有包含标题和描述的应用程序页面的“修订版”,因此它是一对多的关系。显示应用程序页面时,会选择具有匹配applicationRevisions ID的最新application行。

但是,我无法知道在任何特定时间是否存在具有特定名称的应用程序,因为以前的修订可能具有不同的名称,并且该名称未存储在applications表中。

我有一个解决方法;将当前名称存储为applications中的字段,并在编辑应用程序时,将该行照常添加到applicationRevisions,但随后更新name行中的applications

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

因此,您希望搜索一个名称以获取该应用程序,然后获取该应用程序的最新版本,该应用程序可能不再具有该名称。对于子查询,这当然是可能的,但对于某些修订版具有相同名称的应用程序,您打算做什么?

如果应用程序表可以保存名称和描述,则会更加清楚。说实话,这可能只是一个表,因为应用程序中的时间和用户可能与用于每个应用程序的第一个修订版的用户相同。只剩下视图字段,它可以位于仅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”这个名称的应用程序的最新版本的所有字段。

答案 1 :(得分:1)

纠正我如果我在这里遗漏了一些东西,那么每个应用程序条目必须至少有一个applicationRevision吗?

为什么不使用外键约束?使applicationRevision表的应用程序字段成为外键。使用id而不是名称标识应用程序。将名称命名为修订版的属性。

因此,假设您要搜索名为“wxyz”的应用程序,那么您可以

select id,application from applicationRevision where name="wxyz" order by time DESC LIMIT 1;

这为您提供了应用程序ID。您可以从单个查询中执行JOIN并获取应用程序字段