SQL 数据库 - 将一列的最大值取为另一 table 列

SQL Database - Taking one columns max value for another table column

我设计了我的数据库并且有 3 个 tables:

1) Authors table 有身份证、姓名、姓氏和 Paper_ID。 名字和姓氏组合是唯一的。

2) Topics table 有 TopicName、SOTAResult 和 Paper_ID。 TopicName、SOTAResult 是唯一的。

3) Papers table 有标题(唯一)、结果、摘要。

我这样设计是因为一篇论文有多个作者和多个主题,但只有一个结果。 我的问题是,我想将论文 table 中结果列的最大值分配给主题 table 中的 SOTAResult 列。 更清楚地说,SOTAResult 应该是一个主题的论文结果的最大值。 我也想知道我是否根据需要正确地构建了这个数据库,或者我应该专门更改一些东西。

您需要作者和论文之间的 m:n 关系:一位作者可以写多篇论文,一篇论文可以由多位作者撰写。你用一座桥 table:

  • table author (author_id, first_name, last_name, ...) <= 对 first_name + last_name 具有唯一约束,主键是 author_id
  • table paper (paper_id, title, result, ...) <= 对 tiltle 具有唯一约束,主键是 paper_id
  • table author_paper (author_id, paper_id) <= 对 author_id + paper_id
  • 具有唯一约束

您还需要论文和主题之间的 m:n 关系:

  • table topic (topic_id, name, ...) <= 对 name 具有唯一约束,主键是 topic_id
  • table paper_topic (paper_id, topic_id) <= 对 paper_id + topic_id
  • 具有唯一约束

您不会冗余地存储结果。如果您想知道某个主题取得的最大结果,您可以 select 使用连接,例如:

select t.name as topic_name, max(p.result) as max_result
from paper_topic pt
join paper p using (paper_id)
join topic t using (topic_id)
group by t.name
order by t.name;

我会添加一个 PapersAuthors table 以方便作者拥有多篇论文。我会添加一个 TopicsPapers table 这样一个主题可以有多篇论文,一篇论文可以有多个主题。如果一篇论文不应该在多个主题中,那么就不要有 TopicsPapers 并在 Papers 中添加 topic_id。

我不确定我是否理解您试图通过 SOTAResult 实现的目标,但我相信您想要找到某个主题的 "best paper"。在这种情况下,将 SOTAResult 移动到 Papers 并使用 "limit 1 subquery":

找到它
SELECT t.*, (SELECT paper_id FROM Papers AS tp WHERE tp.topic_id=t.topic_id ORDER BY SOTAResult DESC LIMIT 1) AS top_paper FROM Topics AS t;