2016-07-22 88 views
1

您好我有技能表如下排序结果从另一个表

enter image description here

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

PHP(10),ASP(5),Perl的(1)

及其装置10的用户加入PHP作为他们的技能,5个用户ASP等

我已存储的技能在用逗号技能栏用户表分开

enter image description here

+0

哪里是你的另一个表?请给我们看。 – Blank

+3

从您提供的信息中,我会说你的数据库结构在这里是一个问题。您可能需要为“技能”,“用户”和“users_skills”使用单独的表以连接它们。如果您只将技能存储为逗号分隔值,则每次要获取总数时都必须遍历所有用户。 – cybrox

+0

当您获取数据然后使用爆炸时加入这两个表。 – Bhavin

回答

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 
+0

这里是我的最终查询“select id,name,cnt from( select *,(select sum(1)from users u where find_in_set(s.id,u.skills))as cnt from skills s )t order by cnt desc limit 20“ – Pradeepta

+0

非常感谢你@JPG – Pradeepta

+0

@Pradeepta哇,它的作品? :-D – Blank

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; 

它排除了没有被任何用户选中的技能。如果您也想包含这些,请将连接更改为左连接。

编辑:随着最初的问题更新,包括用户表的定义,那么也许这就足够了。同样你需要一个左连接来包含没有用户选择的技能。

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; 
+0

谢谢@topdog,你的第二个查询工作正常。 – Pradeepta

+1

我怀疑由@JPG给出的find_in_set()解决方案在使用大数据集时比使用它更有效率/高性能,但看过它。更容易理解。 – topdog

+0

是的你是对的。谢谢@topdog – Pradeepta

相关问题