2011-09-06 63 views
0

我有这样的疑问,计数taht匹配网站= $网站的所有行:MySQL查询计数并检查匹配吗?

$count= mysql_query("SELECT COUNT(DISTINCT `Site`) FROM `Ratings` WHERE `Site` = '$site'"); 

上述查询得到的评分数量为$网站。但是我也需要知道用户是否已经对网站进行了评分。我使用的是用于此另算:

SELECT COUNT(*) FROM `Ratings` WHERE `Site` = '$site' AND `UID` = '$uid'" 

是否有可能获得现场比赛的数量,并检查用户评为该网站在一个查询?谢谢

回答

0

是的,这不是很直接,但你可以在一个查询中做到这一点。试试这个:

SELECT COUNT(*) as 'num_ratings', IF(`UID` = '$uid','YES','NO') as 'already_rated' FROM `Ratings` WHERE `Site` = '$site' ORDER BY already_rated DESC 

这个查询会返回1行2列。第一列num_ratings将是该特定网站的评分数量,并且already_rated会告诉您该特定用户是否对该网站进行了评分。 (它会是'是'或'否')

ORDER BY already_rated DESC确保如果用户对网站进行了评分,它将返回YES,因为YES在字母表后面出现NO。这是必要的,因为当你使用COUNT()时,行被分组在一起。

编辑:进一步测试后,上述解决方案将无法正常工作。改用这个。

SELECT COUNT(*) as 'num_ratings' IF(GROUP_CONCAT(IF(`UID` = '$uid', 'YES','NO') SEPARATOR ',') LIKE '%yes%', 'YES','NO') as 'already_rated' FROM `Ratings` WHERE `Site` = '$site' 
+0

如果确实有可能在MySQL中“对飞” GROUP BY值在选择列表中,因为你是在这种情况下,与是/否列暗示,那么你的查询将返回2行,如果用户评分,则计数将会减1。如果无法做到这一点,将会产生错误。如何将一个聚合函数与一个查询中的单个行的评估结合起来? – cdonner

+0

@cdonner如果省略GROUP BY子句,则相当于按所有行进行分组。 (直接从这个[mysql doc](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html)。 我在我自己的表中的一个表上测试了我的查询,并且它返回一行两列,如上所述 –

+0

@ cdonner7我只是在SELECT子句中添加了一些东西,所以它根本不会影响计数 –

0

我只有MySQL的肤浅知识,我看到它做某些事情比其他DBMSs(有时更好)有所不同,但我仍然认为你不计算每个网站与您的查询评级,而是数量您的评分表中的“独特”网站,如果受到“网站”参数的限制,该网站始终为1。 你需要一个GROUP BY,以便通过网站来算等级,如:

SELECT 
    count(*) 
FROM `Ratings` 
WHERE `Site` = '$site' 
GROUP BY `Site` 

您有包括检查,如果用户评为网站不同的选择。一个是相关的子查询,它为您提供结果集中每个站点的信息。

SELECT 
    count(*), 
    (SELECT count(*) from `Ratings` where `Site` = r.`Site` and `UID` = '$uid') 
     as has_rated 
FROM `Ratings` r 
WHERE `Site` = '$site' 
GROUP BY `Site` 

另一个办法是自连接 - 这通常有性能上的优势,在一个子查询(子查询有结果集中的每一行进行评估和连接没有)。但是,由于您正在限制网站的查询,并且总是期望结果集中只有一行,所以它们几乎没有什么区别。