/ / Percentuale di selezione MySQL - mysql, sql

Percentuale di selezione di MySQL: mysql, sql

Ho una tabella di database "tblfavs" con cinque colonne: id, userid, logoid, favdate, did.

Voglio determinare la percentuale dei preferiti (id) di un utente (id) che condividono lo stesso id designer (fatto), e dove userid <> ha fatto, visualizzato dalla percentuale più alta al più basso.

In formato pseudo-query:

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

Non riesco a capire come funziona la domanda. Aiuto apprezzato!

Modificare:

Dati di esempio

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

In questo set utente 1 (seconda colonna) ha due voci ed entrambi hanno "2" come id del progettista (colonna finale).

Uscita prevista

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

risposte:

3 per risposta № 1

Ciò è più semplice in altri DBMS che presentano funzioni di finestra (ad es. COUNT OVER). Tuttavia, questo non è poi così difficile in MySQL. Hai solo bisogno di due aggregazioni: contare per userid e did, conta per userid, dividere.

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 per risposta № 2

Prova questo (migliorato dalla risposta precedente in modo che corrisponda al tuo input esatto, in modo da ottenere% per ogni riga non aggregata)

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;