2013-10-28 64 views
0

我必須設置一個模塊,用戶可以投票給個人資料A或B.每個記錄將存儲3個重要值:投票人,贏了,失敗的人。獲得至少贏得特定比例時間的獲獎者名單的SQL

用戶

  • id_user
  • 名稱

user_versus

  • id_versus - 主鍵
  • id_user - 誰票
  • id_user_winner 之一 - 贏家,顯然
  • id_user_loser - 失敗者

我可以單獨執行這些查詢計算用戶的百分比:

  • $ wins ='SELECT COUNT(*)FROM user_versus WHERE id_user _winner = 6';
  • $ loses ='SELECT COUNT(*)FROM user_versus WHERE id_user_loser = 6';
  • $ total = $ wins + $ loses;

所以%勝= $勝/ $總

不過,我相信,查詢可以優化到只有一個,然後用它作爲報告查詢的子查詢(這是其中一個我實際上需要幫助)。該報告需要返回:有一個雙贏的百分比比指定的用戶

的奪冠百分比我對如何從這個角度上進行不知道更多的用戶

名單。任何提示將有所幫助。謝謝!

回答

2

對於一個用戶:

SELECT ifnull(wins, 0) wins, ifnull(loses,0) loses, 
     ifnull(wins, 0)+ifnull(loses,0) total, 
     ifnull(wins, 0)/(ifnull(wins, 0)+ifnull(loses,0)) percent 
FROM (
SELECT 
(SELECT COUNT(*) FROM user_versus WHERE id_user_winner = 6) wins, 
(SELECT COUNT(*) FROM user_versus WHERE id_user_loser = 6) loses 
) subqry 

對於所有用戶:

SELECT id_user_winner AS id_user, 
     ifnull(wins, 0) wins 
     ifnull(loses,0) loses 
     ifnull(wins, 0)+ifnull(loses,0) total, 
     ifnull(wins, 0)/(ifnull(wins, 0)+ifnull(loses,0)) percent 
FROM (
    SELECT id_user_winner AS id_user FROM user_versus 
    UNION 
    SELECT id_user_loser FROM user_versus 
) u 
LEFT JOIN 
FROM (
    SELECT id_user_winner, count(*) wins 
    FROM user_versus 
    GROUP BY id_user_winner 
) w 
ON u.id_user = id_user_winner 
LEFT JOIN (
    SELECT id_user_loser, count(*) loses 
    FROM user_versus 
    GROUP BY id_user_loser 
) l 
ON u.id_user = l.id_user_loser 
+0

,如果你有任何的損失用戶,會發生什麼?如果你有一個沒有勝利的用戶會發生什麼?我建議你從User開始,並對你的內聯視圖做兩個左連接。當然你需要注意那些既沒有(除零) –

+0

@Conrad Frix的用戶非常感謝你的評論。我糾正了答案。除以0是不可能的,因爲由查詢檢索的每個用戶必須始終是贏家或輸家,或兩者都是。我們除以:win + lose的總和,並且這個總和必須總是> 0。 – krokodilko

+0

@kordirko爲什麼我還會獲得帶NULL值的id_user列?試圖找出沒有成功......:s – andufo