一尘不染

GROUP_CONCAT有限制

mysql

我有表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个技能的限制。
我尝试了子查询的几种变体..联接等等,但是没有任何效果。


阅读 230

收藏
2020-05-17

共1个答案

一尘不染

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

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

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

小提琴

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

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

2020-05-17