0

假设我有两张桌子

TABLE A
id     name
1      emon
2      sumon
3      mamun
4      bonna
5      ferdousi

TABLE B
id     name_id score
1      1       100
2      2       0
3      2       10
4      3       50
5      3       60

我想要这个数据

name    score
emon    100
sumon   0
sumon   10
mamun   50
mamun   60

我知道这很容易查询,就像:

SELECT A.name, B.score FROM A 
RIGHT JOIN B
ON A.id=B.name_id

但是当我设置外键时这个查询不起作用

SELECT sum(B.score) FROM A 
RIGHT JOIN B
ON A.id=B.name_id
group by B.name_id

我的问题是在这种情况下如何设置外键?我知道在关系数据库中,没有关系可能不是一个好的决定。在这种情况下GROUP BY,当我设置外键时,子句不起作用。有什么好主意吗?

4

2 回答 2

1

B.name_id您将在引用时设置外键A.id

在 MySQL 中,这将像这样完成:

ALTER TABLE B ADD FOREIGN KEY (name_id) REFERENCES A(id)

注意:如果您还没有在 上的索引name_id,您应该先创建它。

在这种情况下A.id,列必须是唯一的。我猜它已经是表 A 的主键,所以这不是问题。

拥有外键的好处是它可以保持引用完整性。也就是说,您可以保证name_idB 中的 every 实际上引用 A 中的现有记录。如果没有外键,您将能够name_id=999, score=50在 B 中插入行,该行引用没人。使用外键,数据库引擎将拒绝此插入。

于 2013-08-15T02:13:51.017 回答
1

回答修改后的问题

转述问题:

为什么此查询不适用于架构?

SELECT sum(B.score) FROM A 
RIGHT JOIN B
ON A.id=B.name_id
GROUP BY B.name_id

部分答案必须是“它以什么方式'不起作用'?” 如所写,查询应该为 B 中的每一行生成一个答案行。

100
 10
110

RIGHT OUTER JOIN (ROJ) 确实对查询结果没有任何影响;您也可以省略关键字 RIGHT 并得到相同的结果:

SELECT SUM(B.score)
  FROM A 
  JOIN B ON A.id = B.name_id
 GROUP BY B.name_id

如果您想获得表 A 中列出的每个玩家的姓名和总分,这看起来似乎是合理的,那么您可以这样写:

SELECT A.Name, SUM(B.Score) AS TotalScore
  FROM A
  LEFT JOIN B ON A.id = B.Name_ID
 GROUP BY A.Name

RIGHT OUTER JOIN 已被 LEFT OUTER JOIN 取代。这将列出所有玩家。

回答问题的原始版本

适用于显示和询问的架构的原始问题:

我的问题是在这种情况下如何设置外键?

  1. 您将在 TableA(ID) 上有一个主键。
  2. 您将在 TableB(ID) 上有一个主键。
  3. 您将在 TableB(Name_ID) 上创建一个引用 TableA(ID) 的外键。
于 2013-08-15T02:14:20.567 回答