我有表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()剥