MySQL查询计数并检查匹配?

时间:2011-09-06 00:41:11

标签: mysql

我有这些查询计算所有与Site = $ site:

相匹配的行
$count= mysql_query("SELECT COUNT(DISTINCT `Site`) FROM `Ratings` WHERE `Site` = '$site'");

上面的查询获取$ site的评分数。但我还需要知道用户是否已经对该网站进行了评分。我正在使用另一个COUNT:

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

是否可以获取网站匹配的数量并检查用户是否在一个查询中对网站进行了评分?感谢

2 个答案:

答案 0 :(得分:0)

我只有表面的MySQL知识,我已经看到它做某些事情的方式与其他DBMS不同(有时候更好),但我仍然认为你不是用你的查询计算每个网站的评分,而是用'您的评级表中的不同“网站”,如果使用“网站”参数进行约束,则始终为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`

另一种是自连接 - 通常比子查询具有性能优势(必须为结果集中的每一行计算子查询,而不是连接)。但是,由于您按站点约束查询并且总是期望结果集中只有一行,因此它会产生很小的差异。

答案 1 :(得分: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'