您好我有技能表如下排序結果從另一個表
各種用戶添加技能,他們的個人資料。現在我想列出他們使用的所有技能遞減順序。像如下
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