2011-12-21 64 views
1

我是你在MySQL中稱之爲'noob'的人。我可以插入/編輯/選擇東西,但任何更高級的東西都會讓我感到困惑。我在我的數據庫中的兩個表:你如何訂購兩張表?

表 '評論'

id  int(11) 
review varchar(2500) 
game int(11) 
user int(11) 
title varchar(200)` 

表 'review_rating'

user int(11) 
review int(11)  // Corresponds to `reviews.id` 
like tinyint(1) 

這裏是我的問題:是否有可能使用ORDER BYreviews表中按照'like'= 1(其中'review'='reviews'表的id)除以total值得到review_ratings總數的結果l review_ratings數量(其中'review'='reviews'表格的ID)。

例子:

SELECT * 
FROM `reviews` 
WHERE `game` = ? 
ORDER BY (total number of review_ratings where review = reviews.id and like = 1/
     total number of review_ratings where review = reviews.id) 
LIMIT 0, 10 
+0

你不必一個名爲「review」的表格。不要指望「review.id」解決任何有用的問題。 – 2011-12-21 22:03:31

回答

2
SELECT t.review, 
     Score = CASE WHEN TotalReviews<> 0 THEN LikedReviews/TotalReviews ELSE NULL END 
    FROM (
       SELECT *, 
        (SELECT COUNT(*) FROM review_rating WHERE review = r.review) AS TotalReviews , 
        (SELECT COUNT(*) FROM review_rating WHERE review = r.review AND like = 1) AS LikedReviews, 
       FROM review r   
      WHERE game = ? 
     )t 
ORDER BY t.review, Score 
+0

我得到你的解決這個:http://pastebin.com/c9ps3L2j,但現在的MySQL說:「#1054 - 未知列'字段列表'中的'TotalReviews'」 – Matt 2011-12-21 22:52:22

+0

殘留嘗試:分數= CASE WHEN t.TotalReviews <> 0 THEN t.LikedReviews/t.TotalReviews ELSE NULL END – Akhil 2011-12-21 22:58:50

+0

是的,我改變了這一點,它返回相同的錯誤:你可以嘗試上面更新的代碼? – Matt 2011-12-21 23:00:02

2

我認爲這是更清晰的把它放在SELECT子句中:

SELECT reviews.*, 
     (SELECT SUM(like)/COUNT(1) 
      FROM review_ratings 
      WHERE review = reviews.id 
     ) like_ratio 
    FROM reviews 
WHERE game = ? 
ORDER 
    BY like_ratio DESC 
LIMIT 10 
; 

注:

  • 尚未測試;目前我離開了一個MySQL框。
  • 我想你可以將子查詢移動到ORDER BY條款,但是它似乎是一個有用的東西來檢索,無論如何。
  • 我不確定如果給定的評論沒有評分,上述情況如何表現。您可能需要使用CASE表達式來處理這種情況。
0

像這樣由每一次審查總review_rating命令:

select(count(review.id) as 'total' from reviews join review_rating on review.id = review_rating.review group by review.id) order by total 

數學不正是你所得到的,但希望你會得到它