【问题标题】:Get a user ID from a SQL database with Multiple Tables从具有多个表的 SQL 数据库中获取用户 ID
【发布时间】:2019-09-08 23:12:24
【问题描述】:

我正在尝试为观看了一定数量电影的用户获取电子邮件地址。例如,如果用户在我对电影 3 运行查询时观看了电影 1、2 和 3,那么该用户应该出现在我的表中。但是当用户匹配所有条件时,例如当我运行查询用户观看电影 1、2、3 和 4 时,该用户不应该出现。

这是两张表:

SELECT Email 
From Users
Inner Join Movies On Users.ID = Movies.ID
Where(Movies = "Movie 1" AND Movies = "Movie 2")

但是有些用户 1 和用户 2 的显示方式,但它只需要列表中的用户 1。

【问题讨论】:

    标签: mysql sql database sqlite ms-access


    【解决方案1】:

    如果您想要看过电影的用户'Movie1''Movie2' 的电子邮件,您可以这样做:

    select u.email
    from users u inner join movies m
    on m.id = u.id
    where m.movies in ('Movie1', 'Movie2')
    group by u.email
    having count(*) = 2
    

    如果存在用户不止一次看过电影的情况,请更改:

    having count(*) = 2
    

    与:

    having count(distinct m.movies) = 2 
    

    【讨论】:

    • 这可行,但解决方案应该考虑到用户可以多次观看一部电影。我们没有那个细节,但如果说一个人购买了剃须刀片和剃须刀手柄,他们可能会多次购买刀片,但不会购买手柄。所以,这个问题从来没有被指定为问题,但理论上,因为用户可以看到同一部电影超过 1 次,因此你得到 2 次,但他们没有看过两部不同的电影。
    【解决方案2】:

    这里有一些可行的解决方案。

    但是,对于此查询的典型类型,如果用户看到两次 Movie1,此处发布的解决方案将失败。比如说一个网站,用户可能已经多次购买剃须刀片,但我们想要剃须刀片和剃须刀手柄。

    因此,原始问题没有说明或指定用户是否可以多次观看同一部电影,但作为 Q + A 问题,没有对问题施加此类限制,因此按逻辑,我们可以合理地假设这是可能的。

    结果,我的“air” sql 是这样的:

    SELECT id, [Name], Email
    FROM tblNames
    WHERE [Name] is in
       (select [Name] from tblMovies where Movies = 'Movie 1')
       AND
     [Name] is in
            (select [Name] from tblMovies where Movies = 'Movie 2')
    

    使用上述内容,用户可以多次观看任何一部电影,但他们必须同时看过以上内容才能正常工作。因此,使用 count 实际上会失败,因为这里没有任何内容表明用户不能多次观看同一部电影。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2017-03-22
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      相关资源
      最近更新 更多