2011-12-21 36 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 

数学不正是你所得到的,但希望你会得到它