2012-01-18 90 views
1

我有三张我需要用于搜索,电影,评论和投票的表格。我想为Movie.Title和Review.Subject使用LIKE函数,并按照每场比赛票数最多的顺序排列它们。如何在JOIN和ORDER BY中使用LIKE进行mysql搜索投票表中大多数行/投票数?

在投票表中有一个ReviewID,UserID,IsGood。每次用户投票时,都会使用MovieID,UserID和1或0对IsGood进行插入,1意味着好的0意味着不好。

所以一个审查可能具有0好的和坏的票,或5好的和差3,等我想显示以下顺序结果:

回顾1 - 10Good/3Bad

评分2 - 4Good/3Bad

评分3 - 0Good/0Bad

匹配顶级票数最高的票数最多,票数最差的票数最多。

这是MySQL查询我写了起来,显然是错误的,但希望有人能帮助我:

mysql_query(" 
    SELECT m.Title, r.Subject, v.ReviewID FROM Movies m 
     LEFT JOIN Reviews r 
      ON m.ID=r.MovieID 
     INNER JOIN Votes v 
      ON r.ID=v.ReviewID 
     WHERE (m.Title LIKE '%" . $search . "%' 
      OR r.Subject LIKE '%" . $search . "%') 
     ORDER BY MAX(COUNT(v.IsGood='1')) LIMIT 10")or die(mysql_error()); 
+0

你需要做'm.Title,r.Subject,v.TipID'一组,或做选择,计算获得的投票数子。 – 2012-01-18 17:30:38

+0

Thx保罗为您的回应。你能告诉我一个例子吗?也许是一个链接?我会搜索你刚才的建议。 – SReca 2012-01-18 17:33:18

+0

尝试在ORDER BY子句前添加'GROUP BY m.Title,r.Subject,v.TipID',那应该这样做! – 2012-01-18 17:34:47

回答

4

这里是一个更全面的答案。 要从一组连接的表格行中获得总数或好的选票和错误的选票,您需要将类似的行组合在一起。

以下应该给你想要的结果。

mysql_query(" 
    SELECT m.Title, r.Subject, v.TipID, sum(v.IsGood) as IsGood, sum(v.isBad) as isBad FROM Movies m 
     LEFT JOIN Reviews r 
      ON m.ID=r.MovieID 
     LEFT JOIN Votes v 
      ON r.ID=v.ReviewID 
     WHERE (m.Title LIKE '%" . $search . "%' 
      OR r.Subject LIKE '%" . $search . "%') 
     GROUP BY m.Title, r.Subject, v.TipID 
     ORDER BY sum(v.IsGood) desc, sum(v.isBad) asc LIMIT 10")or die(mysql_error()); 
+0

我的sql查询就像你在这里显示的那样。但它返回0,现在我的问题是,如果我目前没有投票,那会是问题吗?我是否需要添加某种条件来检查是否有先票? – SReca 2012-01-18 17:58:07

+0

我刚刚添加了一些投票,现在它完美。好吧,从这里开始,我对于如何处理投票表现犹豫不决。我应该添加一些东西来检查是否有先选票?人们会认为没有选票的比赛应该在列表的中间,因为不好或不好,对吧? – SReca 2012-01-18 18:05:42

+0

您可能应该将投票中的INNER JOIN更改为“LEFT JOIN”,即使没有投票也会导致电影被退回 – 2012-01-19 09:32:33