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 № 1Ciò è 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;