2012-10-16 187 views
2

这是我正在做的。我有一个包含重复行的用户评估表。我只想为每个用户获取DISTINCT值。MySQL SELECT Multiple DISTINCT COUNT

在下表中的示例中。如果只有user_id 1和50属于特定位置,则只有每个用户唯一的video_id应该作为COUNT返回。用户1传递了视频1,2和1.所以这应该只有2条记录,并且用户50传递了视频2.所以这个位置的总数是3.我认为我需要在查询中有两个DISTINCT's,但是不知道如何做到这一点。

+-----+----------+----------+ 
| id | video_id | user_id | 
+-----+----------+----------+ 
| 1 |  1 |  1 | 
| 2 |  2 |  50 | 
| 3 |  1 |  115 | 
| 4 |  2 |  25 | 
| 5 |  2 |  1 | 
| 6 |  6 |  98 | 
| 7 |  1 |  1 | 
+-----+----------+----------+ 

这就是我目前的查询的样子。

$stmt2 = $dbConn->prepare("SELECT COUNT(DISTINCT user_assessment.id) 
FROM user_assessment 
LEFT JOIN user ON user_assessment.user_id = user.id 
WHERE user.location = '$location'"); 
$stmt2->execute(); 
$stmt2->bind_result($video_count); 
$stmt2->fetch(); 
$stmt2->close(); 

所以我的查询返回的所有计数的指定位置的,但它不会忽略从每个特定用户非唯一结果。

希望这是有道理的,谢谢你的帮助。

+0

没有解决方案,但优化:使用INNER JOIN。它比LEFT JOIN更快,并且效果相同,因为您使用WHERE子句中的连接表。 – GolezTrol

+0

您是否知道SQL查询中允许换行符? – GolezTrol

+0

@GolezTrol,是的,谢谢。这就是我如何复制丢失换行符的代码。我编辑了我的帖子,使其更容易阅读。 – Jako

回答

1

下面的查询将加入一个子查询,该查询为每个用户提取不同的视频。然后,主要查询会对这些数字进行求和,以获取该位置的视频总数。

SELECT 
    SUM(video_count) 
FROM 
    user u 
    INNER JOIN 
    (SELECT 
     ua.user_id, 
     COUNT(DISTINCT video_id) as video_count 
    FROM 
     user_assessment ua 
    GROUP BY 
     ua.user_id) uav on uav.user_id = u.user_id 
WHERE 
    u.location = '$location' 

注意,既然你已经使用绑定,您也可以通过$location在绑定参数。我把这个留给你,因为它不是问题的一部分。 ;-)

+0

你先生是一个天才,它完美的工作。十分感谢你的帮助! – Jako

6
SELECT COUNT(DISTINCT ua.video_id, ua.user_id) 
FROM user_assessment ua 
INNER JOIN user ON ua.user_id = user.id 
WHERE user.location = '$location' 

你可以写很多东西COUNT里面,所以不要犹豫,把你到底要什么在它。这将给出不同夫妇(video_id, user_id)的数量,如果我理解正确,这就是你想要的。

+0

谢谢你的帮助,这个查询也对我很好。 – Jako

+2

+1我不确定,也没有手头的数据库进行测试,但如果这样的话,这比我的回答好。更紧凑,更清晰,可能更快。 – GolezTrol