2017-10-10 19 views
1

私は5つの列を持つデータベーステーブル "tblfavs"を持っています:id、userid、logoid、favdate、でした。MySQLの選択率

同じデザイナーIDを共有していたユーザー(ユーザーID)のお気に入り(ID)と、ユーザーIDが<の場合のパーセンテージを、最高パーセンテージから最低順位に表示したいとします。疑似クエリ形式で

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

私はこれを達成するために、クエリの周り私の頭を取得することはできません。ヘルプは高く評価しました!

編集:

サンプルデータセットのユーザ1(第2列)において

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 

は、2つのエントリを有し、両方のデザイナーID(最後の列)として "2" を有します。

期待出力

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

あなたには、いくつかのサンプルデータとあなたがしようとしている結果を共有することができますそれを得るために? – Mureinik

+1

私たちにdbスキーマ、サンプルデータ、現在および予想される出力を表示します。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を改善し、より良い回答を得る方法を学ぶことができます。 (http://stackoverflow.com/help/mcve) \tがhttp://rextester.comで –

+0

サンプルをサンプルを作成して試してみてください[**、最小完全、かつ検証例を作成する方法**] \tデータと期待される出力が追加されました。 – blogo

答えて

3

これは、窓関数(例えばCOUNT OVER)もあり、他のDBMSに容易です。しかし、これはMySQLでも難しいことではありません。 2つの集計が必要です:useridの数とdidの数、useridの数を除算します。

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

私は畏敬の念をしています。私の世界では、それは怪物の質問です。ありがとうございました。 – blogo

-1

(あなたがagregatedない各行に対して%を取得し、あなたの正確な入力-ので、一致する前の回答から改善された)、これを試してみてください

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;