GROUP_CONCAT with limit
One somewhat hacky way to do it is to post-process the result of GROUP_CONCAT
:
substring_index(group_concat(s.title SEPARATOR ','), ',', 3) as skills
Of course this assumes that your skill names don't contain commas and that their amount is reasonably small.
fiddle
A feature request for GROUP_CONCAT
to support an explicit LIMIT
clause is unfortunately still not resolved.
UPDATE: As user Strawberry points out, the table player_skills
should have the tuple (player_id, skill_id)
as its primary key, otherwise the schema allows for the same skill to be assigned to a player multiple times, in which case group_concat
would not work as expected.
It is possible if you are using MariaDB 10.3.3+:
Support for LIMIT clause in GROUP_CONCAT() (MDEV-11297)
SELECT p.id,
GROUP_CONCAT(s.title ORDER BY title SEPARATOR ', ' LIMIT 3) 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
GROUP BY p.id
ORDER BY s.id;
db<>fiddle demo
Increase GROUP_CONCAT
function length using GLOBAL group_concat_max_len
GROUP_CONCAT()
maximum length is 1024 characters.
What you can do is to set the GLOBAL group_concat_max_len
in mysql
SET GLOBAL group_concat_max_len = 1000000;
Try this and it will work for sure.
There is a much cleaner solution. Wrap it inside another SELECT
statement.
SELECT GROUP_CONCAT(id) FROM (
SELECT DISTINCT id FROM people LIMIT 4
) AS ids;
/* Result 134756,134754,134751,134750 */