按其他表格的结果排序

时间:2016-07-22 06:40:35

标签: php mysql join subquery

我有技能表如下

enter image description here

各种用户为其个人资料添加技能。现在我想列出他们使用的所有技能递减顺序。如下所示

Php(10),ASP(5),Perl(1)

它意味着10个用户添加了php作为他们的技能,5个用户ASP等。

我已将技能存储在技能列中的用户表中,并以逗号分隔

enter image description here

2 个答案:

答案 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;