2009-09-22 80 views
1
SELECT game_ratingstblx245v.game_id,avg(game_ratingstblx245v.rating) 
     as avg_rating, 
     count(DISTINCT game_ratingstblx245v.userid) 
      as count, 
     game_data.name, 
     game_data.id , 
     avg(game_ratings.critic_rating),count(DISTINCT game_ratings.critic) 
     as cr_count 
FROM game_data 
LEFT JOIN game_ratingstblx245v ON game_ratingstblx245v.game_id = game_data.id 
LEFT JOIN game_ratings   ON game_ratings.game_id = game_data.id 
WHERE game_data.release_date < NOW() 
GROUP BY game_ratingstblx245v.game_id 
ORDER BY game_data.release_date DESC, 
     game_data.name 


我currenty使用此查詢從3個表
game_data提取值 - ID(外鍵),姓名,RELEASE_DATE \遊戲信息
game_ratings - game_id(外鍵)評論家,評級\評論家評價
game_ratingstblx245v - game_id(外鍵),等級,用戶ID \用戶評價幫助在聯接查詢


我想這個查詢做的是選擇所有的ID從表game_data爲了通過RELEASE_DATE降下來,然後檢查來自表game_ratings和game_rating的平均評分sblx245v對應於個人ID(如果遊戲未被評級,結果應該從後兩個表的字段中返回null)。現在,我在這裏面臨的問題是結果並不像預期的那樣出現(有些遊戲還沒有額定都出現了,而有些則沒有),你們可以檢查我的查詢,並告訴我,我錯了,如果這樣...感謝

+2

你不應該按game_data.game_id分組嗎? – 2009-09-22 00:42:23

+0

這個whamps男人,我只是忽略了它...謝謝你做到了 – halocursed 2009-09-22 00:49:21

回答

2

你不應該在GROUP BY使用game_ratingstblx245v.game_id列,因爲它可能是當給定遊戲ID沒有評分時爲NULL。改爲使用game_data.id

這是我會怎麼寫查詢:

SELECT g.id, g.name, 
     AVG(x.rating) AS avg_user_rating, 
     COUNT(DISTINCT x.userid) AS user_count, 
     AVG(r.critic_rating) AS avg_critic_rating, 
     COUNT(DISTINCT r.critic) AS critic_count 
FROM game_data g 
LEFT JOIN game_ratingstblx245v x ON (x.game_id = g.id) 
LEFT JOIN game_ratings r   ON (r.game_id = g.id) 
WHERE g.release_date < NOW() 
GROUP BY g.id 
ORDER BY g.release_date DESC, g.name; 

注意的是,雖然這個查詢產生xr之間的笛卡爾積,它不影響平均收視率的計算。請注意,將來如果您在做SUM()COUNT(),計算可能會被意想不到的笛卡爾乘積誇大。

+0

感謝Bill對於額外的信息你永遠是第一個幫助我的人......在旁註中我不明白你在說什麼是指笛卡爾積? – halocursed 2009-09-22 00:55:17

+1

笛卡爾積是一個表中的每一行與第二個表中的每一行相結合的產品。假設第一個表中有10個匹配的行,第二個表中有12個匹配的行。如果沒有條件限制這兩者之間的匹配條件,那麼結果中最終會有120行。在像您這樣的查詢中,這意味着每個收視表中的行會無意中重複出現。如果你正在做COUNT()或SUM(),這將會是一個問題。 – 2009-09-22 01:00:02

+1

要查看正在使用的笛卡爾產品,請嘗試不帶GROUP BY的查詢,並顯示「rating」列而不是計算AVG()。你會看到很多重複的行。 – 2009-09-22 01:01:16