2012-04-26 33 views
0

如果我必须找到不止一次查看同一视频的所有用途,那么我正在使用以下查询。oracle sql - 与加入并加入?

SELECT userid AS users,video_id 
FROM watching_list GROUP BY userid , video_id HAVING COUNT(*) > 1; 

^^它确实给你,对不对?如果watching_list包含用户观看的userid和videoid并且包含日期时间戳。

我想要做的是加入到用户表,基于用户名,以查找用户的名称等,而不仅仅是用户名。

我试过做简单的连接,当然它打破了我。

回答

4
SELECT Users.Name, Users.userid AS users,video_id 
FROM watching_list 
    JOIN Users 
     ON Users.UserID = watching_list.UserID 
GROUP BY Users.userid , video_id, Users.Name 
HAVING COUNT(*) > 1; 

为什么这会打破?它应该是相同的用户,所以将同一个人的group by的其他信息应该不会引起变化

Here is a crude, quick SQLFiddle to prove this

3

一个有些不雅的方式来做到这一点是像这样:

Select USERS.LAST_NAME, 
     USERS.FIRST_NAME, 
     double_watchers.VIDEO_ID 
    FROM USERS, 
     (SELECT userid AS users, 
       video_id 
     FROM watching_list 
     GROUP BY userid , video_id 
     HAVING COUNT(*) > 1) double_watchers 
Where double_watchers.userid = users.id; 

我创建你的原始查询内嵌表(不知道的术语),然后其连接到用户表。这可能是一种更有效的方法,但我现在没有一个测试实例在我面前进行实验。

+0

你不需要的子查询可言,简单的加入和加入到组将工作。只要用户标识保留在组中,那么通过基于用户向组添加更多信息将不会执行任何操作 – 2012-04-26 03:51:50

+1

我会查看真实数据集上的执行计划。 我可以想象这比连接方法更有效,因为如果只有少数用户满足“不止一次”的条件,那么内联视图将首先执行,然后是用于访问用户表的嵌套循环连接。在连接方法中,可能会执行在watching_list和用户之间的哈希连接,然后执行聚合。事实上,在join-first查询中聚合的成本更高,因为group by子句中有更多的字节。 由于这些原因,我赞成Marc对Justin的解决方案。 – 2012-04-26 08:12:19

+1

@DavidAldridge我同意这可能会更好,但会建议OP配置文件两种方法来确保。 – 2012-04-26 12:36:00