您好我有技能表如下排序结果从另一个表
各种用户添加技能,他们的个人资料。现在我想列出他们使用的所有技能递减顺序。像如下
PHP(10),ASP(5),Perl的(1)
及其装置10的用户加入PHP作为他们的技能,5个用户ASP等
我已存储的技能在用逗号技能栏用户表分开
您好我有技能表如下排序结果从另一个表
各种用户添加技能,他们的个人资料。现在我想列出他们使用的所有技能递减顺序。像如下
PHP(10),ASP(5),Perl的(1)
及其装置10的用户加入PHP作为他们的技能,5个用户ASP等
我已存储的技能在用逗号技能栏用户表分开
试试这个:
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
假设你有另一台/关系来表示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;
它排除了没有被任何用户选中的技能。如果您也想包含这些,请将连接更改为左连接。
编辑:随着最初的问题更新,包括用户表的定义,那么也许这就足够了。同样你需要一个左连接来包含没有用户选择的技能。
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;
哪里是你的另一个表?请给我们看。 – Blank
从您提供的信息中,我会说你的数据库结构在这里是一个问题。您可能需要为“技能”,“用户”和“users_skills”使用单独的表以连接它们。如果您只将技能存储为逗号分隔值,则每次要获取总数时都必须遍历所有用户。 – cybrox
当您获取数据然后使用爆炸时加入这两个表。 – Bhavin