SQL查询所有看过相同电影的用户

Posted

技术标签:

【中文标题】SQL查询所有看过相同电影的用户【英文标题】:Query all users who have watched the same movies in SQL 【发布时间】:2021-01-13 01:31:26 【问题描述】:

我需要执行一个简单的查询,它将返回所有观看过相同电影的用户、他们观看的日期以及每部电影的观看次数。结果应按电影标题分组。

假设我有电影名称:角斗士和普罗米修斯。结果应该是这样的:

    角斗士:观看次数:10 次|作者:艾伦、布鲁斯、塞西尔、马龙等|日期:2020 年 10 月 1 日、2019 年 1 月 11 日等 普罗米修斯:观看次数:7 次|作者:朱莉娅、班纳、艾伦、马龙等 |日期:2020 年 10 月 1 日、2019 年 1 月 11 日等

我有 MOVIE 表、USER 表、VIEW 表

一些可能有助于您理解我的问题的信息:

MOVIE 有观看次数行 VIEW 有日期行 USER 有姓名等

我的问题有点类似于:Query on all the people who has watched the same movies as I did,但我无法根据我的情况调整解决方案。

我怎样才能做到这一点?

【问题讨论】:

嗨。虽然它不应该太复杂,但如果没有您所做的最少代码、表结构等,我们将无法为您提供帮助。请在您的问题中添加信息 “所有看过同一部电影的用户”没有意义。如果人们停止尝试清楚地书写,那么人们可能会在尝试推理和交流返回所需内容的查询时遇到困难。当明确时,这将是一个常见问题解答。 PS 这样的“全部”开始所需的行是不需要的,并且很容易与“全部”的其他用途混淆。 PS 在给出业务关系(船舶)/关联或表(基础或查询结果)时,请说出其中的一行根据其列值说明了业务情况。 PS请:展示你可以做的部分。在代码问题中给出minimal reproducible example。 @ShirGans 表结构和我最初的问题中已经包含的一样简单 将提问所需的所有内容都放在问题中,而不仅仅是在链接中。无论如何,您的其他帖子也没有minimal reproducible example。这包括剪切、粘贴和可运行代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com &标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。help center Meta Stack Overflow Meta Stack Exchange 【参考方案1】:

我假设以下表结构:

movie: movie_name, view_count
user: user_name, age, city
view: movie_name, user_name, view_date

查询可以是:

select m.movie_name as movie, 
       m.view_count as watched, 
       listagg(v.user_name, ',') as by, 
       listagg(v.view_date) as on
from   movie m, view v
where  m.movie_name = v.movie_name
group  by m.movie_name, m.view_count;

按功能分组listagg 在Oracle 的SQL 中可用。微软的SQL有类似的string_aggmysql中的group_concat

【讨论】:

感谢您的回答。视图表有 user_id 而视图也有 movie_id 试图适应我的查询,但无法适应。您的示例没有考虑到我们必须在查询中传递 movie_name 的事实

以上是关于SQL查询所有看过相同电影的用户的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询以查找具有相同列值的多行

SQL 查询优化(嵌套子查询)

简单的sql查询

搜索页面的 SQL 查询

sql 查询具有相同tag的用户

PL/SQL 迭代所有模式并在所有模式上运行相同的查询