当前位置: 首页 > 面试题库 >

GROUP_CONCAT有限制

长孙哲
2023-03-14
问题内容

我有表player-s在许多一对多的关系与skill-s

目标是通过单个查询列出球员及其“前三项技能”。

小提琴

create table player(
  id int primary key
);

create table skill(
  id int primary key,
  title varchar(100)
);

create table player_skills (
  id int primary key,
  player_id int,
  skill_id int,
  value int
);

查询:

SELECT 
p.id,  
group_concat(s.title  SEPARATOR ', ') as skills

FROM player p
LEFT JOIN player_skills ps ON ps.player_id = p.id
LEFT JOIN skill s ON s.id = ps.skill_id

WHERE ps.value > 2
-- skills limit 3 some how ...
group by p.id 
order by s.id


-- expected result
-- player_ID, skills
-- 1 , 'one'
-- 2 , 'one'
-- 3 , 'two, three, four'

正如您在小提琴中看到的那样,查询结果仅缺少3个技能的限制。
我尝试了子查询的几种变体..联接等等,但是没有任何效果。


问题答案:

一种比较古怪的方法是对结果进行后处理GROUP_CONCAT

substring_index(group_concat(s.title SEPARATOR ','), ',', 3) as skills

当然,这是假设您的技能名称不包含逗号,并且数量很少。

小提琴

一个功能请求用于GROUP_CONCAT支持一个明确的LIMIT条款是可惜还是没有得到解决。

更新
:正如用户Strawberry指出的那样,该表player_skills应具有元组(player_id, skill_id)作为其主键,否则该架构允许多次将同一技能分配给玩家,在这种情况下group_concat将无法正常工作。



 类似资料:
  • 问题内容: 我在使用MySQL的“ GROUP_CONCAT”功能时遇到问题。我将使用一个简单的帮助台数据库来说明我的问题: 请注意,该帮助台数据库有两个票证,每个票证都有两个解决方案条目。我的目标是使用SELECT语句创建数据库中所有故障单及其对应解决方案条目的列表。这是我正在使用的SELECT语句: 上面的SELECT语句的问题在于它仅返回一行: 请注意,它正在返回票证1的信息以及票证1和票证

  • 问题内容: 我有一张桌子,像: 我试过了: 但我想按顺序获取视图,例如: 问题答案: 您可以通过以下方式在函数内部使用:

  • 问题内容: 我有2个表,用户并遵循。下表后面有一个名为状态的列。我想根据状态对每个用户进行分组的次数进行计数。 下面的查询返回每个用户的每种状态类型的记录。 返回类似: 但我想要更友好的东西: 尝试使用group_concat和计数,但没有用。有什么线索吗? 问题答案: 您需要使用GROUP BY两次,首先从下面的(user_id,status)开始获取计数,然后从连接的表到concat的user

  • 问题内容: (注意:这个问题不是关于转义查询,而是关于转义结果) 我正在使用GROUP_CONCAT将多行合并为一个逗号分隔的列表。例如,假设我有两个(示例)表: 我想列出所有帖子以及对帖子发表评论的每个用户名的列表: 给我: 这很好用,但是如果用户名包含逗号会破坏用户列表。MySQL是否具有可以让我转义这些字符的功能?(请假定用户名可以包含任何字符,因为这只是示例架构) 问题答案: 如果用户名中

  • 问题内容: 在Informix的SQL中寻找可模拟MySQL功能的查询。 MySQL的作用是创建该组中所有成员的枚举。 因此,数据如下: 和以下查询: 会产生: 在Informix中实现这一目标的最有效方法是什么?我们一定要使用存储过程吗? 问题答案: 为此,您必须定义一个用户定义的聚合。这包括四个部分-四个功能(在IDS 12.10信息中心中 搜索CREATE AGGREGATE ): 初始化器

  • 问题内容: ms-access中是否有group_concat函数或类似的东西? 问题答案: 您应该问自己是否需要通用解决方案(另一个是Allen Browne的解决方案),还是仅出于当前目的而需要。如果您真的只需要一次,那就简单地做一次。 附带说明一下,在VBA代码中连接列表时,请利用长期的Access专家Trevor Best教给我的技巧,那就是将分隔符粘贴在每个值的开头,然后使用Mid()剥