2016-07-22 107 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

相關問題