mysql - 为每个客户 X 写一个查询,另一个客户 Y 与 X 租了至少一部电影
问题描述
使用 sakila 数据库,编写一个查询,为每个客户 X 找到另一个客户 Y,该客户至少与 X 共同租借了一部电影。找到所有这样的客户对 (X, Y),并针对每一对,找到重叠的电影。按重叠电影的数量对结果进行排序
我尝试过使用别名、内部连接和子查询。但是,我相信我的代码存在语法错误。
SELECT o1.customer_id AS CustomerID1,
o2.customer_id AS CustomerID2,
COUNT(*) NoOfOverlappingMovies
FROM( ( (SELECT c.customer_id, f.film_id
FROM customer AS c,
JOIN rental AS r
ON r.customer_id = c.customer_id)
JOIN inventory AS i ON i.inventory_id = r.inventory_id)
JOIN film AS f ON i.film_id = f.film_id
) AS o1
JOIN( ( (SELECT c.customer_id, f.film_id
FROM customer AS c,
JOIN rental AS r
ON r.customer_id = c.customer_id)
JOIN inventory AS i ON i.inventory_id = r.inventory_id)
JOIN film AS f ON i.film_id = f.film_id
) AS o2
ON o2.film_id = o1.film_id AND o2.customer_id < o1.customer_id
GROUP BY o1.customer_id, o2.customer_id
ORDER BY COUNT(*) DESC;
查询应该有 3 列。CustomerID1、CustomerID2 和 NoOfOverlappingMovies。
解决方案
1) 不要在“FROM”和“JOIN”部分之间使用“,”。
2)你的括号有点不对。我试图在没有表格的情况下尽可能地纠正它们:
SELECT o1.customer_id AS CustomerID1,
o2.customer_id AS CustomerID2,
COUNT(*) NoOfOverlappingMovies
FROM( (SELECT c.customer_id, f.film_id
FROM customer AS c
JOIN rental AS r ON r.customer_id = c.customer_id
JOIN inventory AS i ON i.inventory_id = r.inventory_id
JOIN film AS f ON i.film_id = f.film_id
) AS o1
JOIN (SELECT c.customer_id, f.film_id
FROM customer AS c
JOIN rental AS r ON r.customer_id = c.customer_id
JOIN inventory AS i ON i.inventory_id = r.inventory_id
JOIN film AS f ON i.film_id = f.film_id
) AS o2 ON o2.film_id = o1.film_id AND o2.customer_id < o1.customer_id )
GROUP BY o1.customer_id, o2.customer_id
ORDER BY COUNT(*) DESC;
推荐阅读
- c++ - 在带有边框的图像中提取子图像
- android - toLowerCase() 克隆以前的输入符号(仅在不在模拟器中的设备上)
- javascript - JavaScript (ES6):命名参数和默认值
- magento2 - 结构化数据徽标在 Google 搜索中不可见
- android - Gradle 可以在不运行它们的情况下构建 Instrumentation 测试吗?
- graphics - knitr:设置“out.height”突然不保持纵横比
- angular - 更新所有反应形式的值后,将在输入上调用什么事件
- ms-access - 访问 vba 发现类型不匹配错误
- python - Pandas 拆分列,其条目是我自己的类
- python - 使用 dask 将单个 16M 行 csv 并行转换为 Parquet