2016-07-22 27 views
1

HIは、自分のプロフィールにスキルを追加します。今では、すべてのスキルを自分の使用順に並べ替えるようにしたい。注文は別の表から、私は様々なユーザー</p> <p><a href="https://i.stack.imgur.com/5AwOC.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/5AwOC.png" alt="enter image description here"></a></p> <p>以下のようなスキルテーブルを持っている

PHPの(10)以下のようなのようなASP(5)、Perlの(1)

その10ユーザーが私はスキルを格納したスキル、5ユーザーASP等

としてPHPを追加手段カンマでスキル欄のユーザテーブルは、(例えば)USER_IDが含まれており、外部キーをskill_idカラムいる、あなたはuser_skillsを表現する別のテーブル/関係を持っていると仮定すると

enter image description here

+0

どこ別の表がありますか?私たちにそれを示してください。 – Blank

+3

あなたが提供した情報から、私はあなたのデータベース構造がここで問題であると言います。 'スキル'、 'users'と' 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 *、(find_in_set(s.id、u.skills)のwhere uin userからuを選択してください) fromスキルから s )t by cnt desc limit 20 " – Pradeepta

+0

ありがとうございます@JPG – Pradeepta

+0

@Pradeepta Wow、それは動作しますか? :-D – Blank

2

を離れ、その後、あなたはこれを参加したいと思いますスキルテーブル結果を次のようにグループ化します。

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

@topdogありがとう、2番目のクエリは正常に動作しています。 – Pradeepta

+1

あなたが使用して解決したfind_in_set()ソリューションは、@ JPGによって提供されたものと思われます。簡単に理解することもできます。 – topdog

+0

はい、あなたは正しいです。ありがとうございます。@topdog – Pradeepta

関連する問題

 関連する問題