我有技能表如下
各种用户为其个人资料添加技能。现在我想列出他们使用的所有技能递减顺序。如下所示
Php(10),ASP(5),Perl(1)
它意味着10个用户添加了php作为他们的技能,5个用户ASP等。
我已将技能存储在技能列中的用户表中,并以逗号分隔
答案 0 :(得分:4)
试试这个:
select id, name
from (
select *, (select sum(1) from user u where find_in_set(s.id, u.skills)) as cnt
from skills s
) t
order by cnt desc
-- limit 20
答案 1 :(得分:2)
假设您有另一个表/关系来表示user_skills,其中包含(例如)user_id和skill_id外键,那么您希望将其加入技能表并将结果分组,类似于:
select name, count(skill_id) as ranking
from skills join user_skills on skills.id = user_skills.skill_id
group by name
order by count(skill_id) desc, name asc;
它排除了任何用户未选择的技能。如果您也想要包含它们,请将连接更改为左连接。
编辑:更新原始问题以包含users表的定义,那么这可能就足够了。再次,你需要一个左连接来包括没有用户选择的技能。
select skills.name, count(users.id) as qty
from skills join users
on locate(concat(',', skills.id, ','), concat(',', users.skills, ',')) > 0
group by skills.name
order by count(users.id) desc, skills.name asc;