【问题标题】:SQL query for finding the movies that users haven't watched用于查找用户未看过的电影的 SQL 查询
【发布时间】:2021-07-02 13:05:07
【问题描述】:

Let, these are the two tables

I've used except keyword to get the desired output

现在,我的情况是有两个表:

  1. 所有与用户相关的数据都可用(user_id、电子邮件、联系人...)User_id 对我们很重要。
  2. User_id 和特定用户观看的电影名称(每个用户可以有多个记录) 基本上,当任何用户观看可用电影时都会创建此表。

我没有可用电影的列表,所以让我们假设所有电影都已被表 2 中的某个或其他用户覆盖。使用不同的关键字将给出所有可用的电影。

我需要获取一个查询,该查询提供用户 ID 和特定用户未看过的电影等输出。有没有办法不使用在 SQL 上使用“PLSQL”、“except”、“anti join”或“exists”关键字来获取输出

SELECT DISTINCT
    "tabl1"."type",
    "tabl2"."user_id"
FROM
    "tabl2"
RIGHT JOIN 
    "tabl1" ON "tabl1"."userid"  = "tabl2"."user_id"  
WHERE
    "tabl1"."type" NOT IN (SELECT DISTINCT "type"
                           FROM "tabl1" 
                           LEFT JOIN "tabl2" ON "tabl1"."userid"  = "tabl2"."user_id"  
                           WHERE "tabl2"."user_id" IN (SELECT DISTINCT "user_id"
                                                       FROM "tabl2"))

我尝试过使用 join 操作,但它没有给出任何结果,最终只有 NULL。

我不知道如何获得所需的输出。

Is there a way to get a similar output like this without using the functions described above.

【问题讨论】:

  • 我可以建议举一个例子,它的名称与手头的问题有关,例如“电影”、“用户”、“电影观看”等...否则人们会误解问题并您提供的示例 SQL
  • 我不明白你为什么拒绝某些方法。好的 PL/SQL 是一种编程语言,您希望它在 SQL 中完成。反连接是在 DBMS 上使用的一种技巧,其优化器较弱,NOT EXISTSNOT IN 存在问题。你不想混淆它并最终得到一个可读性较差的查询,好吧。但是EXCEPT(或Oracle 中的MINUS)和NOT EXISTS 是合适的方法。为什么解雇他们?
  • @Thorsten Kettner 我需要在 Zoho 分析上使用这个查询,它不支持任何这些功能
  • @tony stark:ConnorMcDonald 指的是您的 tab1.type 等示例与您的解释没有太大关系。我们希望查询包含用户表、movies_watched 表、movie、movie_title、movie_id 等列。建议您更新您的请求并将 SQL 更改为与解释明确相关的内容。
  • @Thorsten Kettner 感谢您的指出,我添加了一些图片作为参考。

标签: sql oracle


【解决方案1】:

这看起来与多对多关系相反,因为一个用户可能不会看很多电影,而一部电影可能不会被很多用户观看。

为什么您将其检索为特定用户不观看的电影。

select movie_name from Movie_table where movie_name not in( select movie_name from userMovieTable where user_id =: user_id) 

【讨论】:

    【解决方案2】:

    您想加入用户和电影,条件是该对不在watched 表中:

    with movies as (select distinct movie from watched)
    select *
    from users u
    join movies m on (u.userid, m.movie) not in (select userid, movie from watched)
    order by u.userid, m.movie;
    

    【讨论】:

    • 谢谢。此外,Zoho 也不支持 with。所以,我坚持这一点。 ://
    • 然后将查询移至 from 子句:join (select distinct movie from watched) m on ...。如果 Zoho 不支持基本的 SQL 功能,那么它似乎是一个糟糕的选择。无论如何,您标记了 Oracle,因此您应该能够使用所有 Oracle 功能。如果 Zoho 不能直接处理,那么在 Oracle 中创建一个视图,这样这些功能对 Zoho 是隐藏的,你只需 select * from the_view
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2019-03-12
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多