这是一个非常常见的用例,但我从来不知道这样做的最佳方式。说我有两张桌子
团队表
- id
- 团队名称
球员表
- id
- team_id
- player_name
在输出html中说我想要显示团队的标题,并在每个团队下面各自的玩家:
第1组
- 鲍勃
- jon
第2队 - 肯 - 杰森
以前我总是为团队使用select语句,并在循环结果时,执行另一个select语句,其中外键将等于外部查询的当前行的ID。这是一种愚蠢,无效的方式吗?做这样的事情的标准方法是什么?我可以使用join,但我猜我需要添加一些逻辑才能显示团队标题一次。我正在使用php + mysql。
答案 0 :(得分:2)
通常循环遍历一个结果集并查询循环内的更多信息并不是一个好主意。如果可能的话,最好避免循环中的数据库查询。如你所知,JOIN可以在这里工作:
SELECT team_name,player_name FROM team INNER JOIN players on team.id=players.team_id
您可以通过多种方式在PHP中处理结果。您可以遍历结果并将它们添加到数组
array(
team1 => array(
bob,
jon
),
team2 => array( etc
然后,您可以遍历数组并按照您想要的方式输出结果。 或者您可以直接循环遍历db结果并在存储团队名称时输出它们,并仅在更改时输出它。我推荐以前的解决方案。它更清洁,抽象更好。
答案 1 :(得分:0)
您有两个选项,一个是连接或一个子查询。每个连接始终可以转换为另一个子查询。
减少查询的标准方法:
整个球队桌上的第一个选择。
然后循环搜索结果,对于团队名称中的x: 和一个简单的选择,其中team_id = x为每个团队。
你会注意到不需要子查询,只需编码逻辑。
答案 2 :(得分:0)
您正在做的是conconating player_name列。从SQL 2008R2开始,没有聚合的conconcate字符串函数 - 除非您使用dot net框架编写并在使用此技术的所有数据库中启用它。
一种适用于所有当前支持版本的方法 - 2005 +
创建一个用户定义的函数,该函数获取团队的id并返回一个名称字符串(以您想要的顺序)
您查询然后变为
SELECT team_name, dbo.af_PayerNames(team_ID) Players FROM [Team tabel]
在函数
中包含字符串DECLARE @Output VARCHAR(4000)
SET @Output = ''
SELECT @Output = @output + ' - ' + COALESCE(Player_Name, '') FROM Players where TeamId = @ param
您可以使用一些花哨的案例逻辑来确保仅在@Output<>时添加分隔符' - ' ''
您可以通过传递参数来扩展您的函数以按不同的顺序排序。解决方案非常易读 - 可能有一种子查询方式 - 但子查询总是让我的头受伤!功能方法不适合使用非常大的表 - 你的大脑可能会受到伤害。
希望这有帮助