/ / Pourcentage de sélection MySQL - mysql, sql

Pourcentage de sélection MySQL - mysql, sql

J'ai une table de base de données "tblfavs" avec cinq colonnes: id, userid, logoid, favdate, did.

Je souhaite déterminer le pourcentage des favoris (id) d’un utilisateur partageant le même identifiant de concepteur (did), et où l’ID utilisateur <> s’affiche, du pourcentage le plus élevé au plus faible.

En format de pseudo-requête:

SELECT [percentage], userid, did
FROM tblfavs
WHERE record has the same userid and did
AND userid <> did
GROUP BY userid
ORDER BY [percentage] DESC

Je ne peux pas comprendre la requête pour y parvenir. Aide appréciée!

Modifier:

Échantillon de données

1, 1, 5, 2017-01-01, 2
2, 7, 3, 2017-01-02, 5
3, 1, 8, 2017-01-02, 2
4, 7, 1, 2017-01-02, 3

Dans cet ensemble, l'utilisateur 1 (deuxième colonne) a deux entrées et les deux ont "2" comme identifiant de concepteur (dernière colonne).

Production attendue

100%, userid 1, did 2
50%, userid 7, did 5
50%, userid 7, did 3
etc.

Réponses:

3 pour la réponse № 1

C’est plus facile dans les autres SGBD qui comportent des fonctions de fenêtre (par exemple, COUNT OVER). Cependant, ce n'est pas si difficile avec MySQL non plus. Vous avez juste besoin de deux agrégations: Nombre par userid et did, compter par userid, diviser.

select
ud.cnt * 100.0 / u.cnt as percentage,
ud.userid,
ud.did
from
(
select userid, did, count(*) as cnt
from tblfavs
group by userid, did
) ud
join
(
select userid, count(*) as cnt
from tblfavs
group by userid
) u on u.userid = ud.userid
order by percentage desc;

-1 pour la réponse № 2

Essayez ceci (amélioré par rapport à la réponse précédente pour correspondre à votre entrée exacte afin que vous obteniez% pour chaque ligne non agrégée)

select
ud.cnt2 * 100.0 / u.cnt as percentage,
ud.userid,
ud.did
from
(
select
out3.userid,out3.did, cnt2
from
(select userid,did from tblfavs) out3
join
(
select
userid, did, count(*) as cnt2
from tblfavs
group by userid, did
) ud on ud.userid = out3.userid and ud.did = out3.did
) ud
join
(
select userid, count(*) as cnt
from tblfavs
group by userid
) u on u.userid = ud.userid
order by percentage desc;