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;
我设计了我的数据库并且有 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;