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

时间:2019-04-26 07:43:09

标签: mysql database-design groupwise-maximum

我设计了数据库,并具有3个表:

1)Authors表具有ID,名称,姓氏和Paper_ID。 名字和姓氏组合是唯一的。

2)Topics表具有TopicName,SOTAResult和Paper_ID。 TopicName,SOTAResult是唯一的。

3)Papers表具有标题(唯一),结果,摘要。

我之所以这样设计,是因为一篇论文有多个作者和多个主题,但只有一个结果。 我的问题是,我想将论文表中结果列的最大值分配给主题表中SOTAResult列。 更明确地说,SOTAResult应该是一个主题的论文结果的最大值。 我也想知道我是否根据自己的需要正确构建了该数据库,还是应该专门更改某些内容?

2 个答案:

答案 0 :(得分:0)

您希望作者与论文之间保持m:n的关系:一位作者可以撰写许多论文,而一篇论文可以由许多作者撰写。您可以通过桥接表实现这一点:

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

您还希望论文与主题之间保持m:n的关系:

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

您不会多余地存储结果。如果您想知道某个主题所能达到的最大结果,则可以通过加入来选择此主题,例如:

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;

答案 1 :(得分:0)

我将添加一个PapersAuthors表,以方便具有多个Papers的Author。我将添加一个TopicsPapers表,以便一个主题可以包含多个论文,并且一个论文可以位于多个主题中。如果一篇论文不应该包含在多个主题中,那么就没有TopicsPapers并将topic_id放在Papers中。

我不确定我是否理解您要使用SOTAResult实现的目标,但是我相信您想找到某个主题的“最佳论文”。在这种情况下,将SOTAResult移到Papers并使用“限制1子查询”找到它:

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;