0

我正在尝试创建一个简单的玩家资料网站,但我的 SQL 遇到了问题。

我有一张球员桌和一张以前的俱乐部桌。由于这是一个多对多的关系,我在球员和以前的俱乐部表之间使用了一个查找表(球员以前的俱乐部)。

在我运行如下所示的 sql 之前,这一切似乎都运行良好:

SELECT player.id, player.name AS name, age, position, height, weight, previousclubs.name AS previousclubs, satscore, gpa
FROM player 
INNER JOIN playerpreviousclubs
ON player.id = playerid
INNER JOIN previousclubs
ON previousclubid = previousclubs.id

问题是,如果一名球员有不止一个以前的俱乐部,那么所有信息(除了以前的俱乐部)都会重复,所以我最终会得到这样的结果。

结果集 1

Name: John Smith
Age: 23
Previous Clubs: Arsenal

结果集 2

Name: John Smith
Age: 23
Previous Clubs: Reading

我想做的是以下几点:

结果集 1

Name: John Smith
Age: 23
Previous Clubs: Arsenal, Reading

任何人都可以向我解释为什么目前正在发生这种情况以及我如何着手纠正它。

谢谢

4

1 回答 1

1

您必须将 GROUP BY 与聚合函数结合使用才能实现所需的行为(即,您需要“聚合”从数据库中检索到的 n 元组,这就是为什么这些函数被称为聚合 :-))。聚合函数的选择取决于您使用的 RDBMS,例如:

MySQL:

SELECT player.id, player.name AS name, GROUP_CONCAT(previousclubs.name)
FROM player
INNER JOIN playerpreviousclubs ON player.id = playerid
INNER JOIN previousclubs ON previousclubid = previousclubs.id
GROUP BY player.id, player.name

PostgreSQL(v8.4 及更高版本):

SELECT player.id, player.name AS name, array_agg(previousclubs.name)
FROM player
INNER JOIN playerpreviousclubs ON player.id = playerid
INNER JOIN previousclubs ON previousclubid = previousclubs.id
GROUP BY player.id, player.name
于 2012-08-20T14:16:56.640 回答