2016-07-22 10 views
1

HALLO Ich habe Fähigkeiten Tabellen untenSortieren nach resultieren aus anderen Tabellen

enter image description here

Verschiedene Benutzer zu ihrem Profil Fähigkeiten hinzuzufügen. Jetzt möchte ich alle Fähigkeiten auflisten, die Reihenfolge ihrer Verwendungen abnehmend. Wie wie unten

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

Das bedeutet 10 Benutzer hinzugefügt PHP als ihre Fähigkeit, 5 Benutzer-ASP usw.

Ich habe die Fähigkeiten, gespeichert in Benutzertabelle in Fähigkeiten Spalte mit Komma getrennt

enter image description here

+0

Wo ist deine andere Tabelle? Zeig es uns bitte. – Blank

+3

Von den von Ihnen bereitgestellten Informationen würde ich sagen, dass Ihre Datenbankstruktur ein Problem ist. Vielleicht möchten Sie eine separate Tabelle für 'skills',' user' und 'users_skills' verwenden, um sie zu verbinden. Wenn Sie Skills nur als kommagetrennte Werte speichern, müssen Sie jedes Mal über ALLE Benutzer iterieren, wenn Sie die Gesamtanzahl erhalten möchten. – cybrox

+0

Verbinden Sie beide Tabellen, wenn Sie Daten erhalten, und verwenden Sie dann explodieren. – Bhavin

Antwort

4

Try this:

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

Hier ist meine letzte Abfrage "wählen Sie ID, Name, cnt von ( wählen Sie *, (wählen Sie Summe (1) von Benutzern u wo find_in_set (s.id, u.skills)) als cnt von Fähigkeiten s ) t um by cnt desc limit 20 " – Pradeepta

+0

Vielen Dank @JPG – Pradeepta

+0

@Pradeepta Wow, es funktioniert? :-D – Blank

2

Sie eine andere Tabelle/Beziehung haben Angenommen user_skills darstellen, die (zum Beispiel) enthält user_id und skill_id Fremdschlüssel, dann würden Sie diese auf die beitreten wollen Skill-Tabelle und gruppieren Sie die Ergebnisse ähnlich wie folgt:

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; 

Es enthält Fähigkeiten, die von keinem Benutzer ausgewählt wurden. Wenn Sie diese ebenfalls einschließen möchten, ändern Sie den Join auf einen linken Join.

Edit: Mit der ursprünglichen Frage aktualisiert, um die Definition der Tabelle Benutzer enthalten, dann würde dies vielleicht ausreichen. Wiederum würden Sie eine linke Verknüpfung benötigen, um Fähigkeiten einzuschließen, die kein Benutzer ausgewählt hat.

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

Danke @topdog, Ihre zweite Abfrage funktioniert gut. – Pradeepta

+1

Ich vermute, dass die von @JPG angegebene Lösung find_in_set(), auf die Sie sich geeinigt haben, effizienter ist/performanter auf einem großen Datensatz als meiner, obwohl ich sie betrachtet habe. Einfacher zu verstehen. – topdog

+0

Ja, Sie haben Recht. Danke @topdog – Pradeepta

Verwandte Themen