LeetCode 1148:SQL查询找出独有浏览文章

发布时间:2026/8/3 10:10:41
LeetCode 1148:SQL查询找出独有浏览文章
1. 题目背景与需求解析这道题目来自知名编程练习平台LeetCode的数据库分类编号1148。作为一道简单难度的SQL练习题它考察的是基础的查询语句编写能力特别适合正在学习数据库操作的新手程序员。题目要求我们从一个名为Views的表中找出所有独有浏览的文章。这里的独有浏览定义为某篇文章被某个作者浏览过且该文章没有被其他作者浏览过。换句话说我们需要找出那些浏览记录中作者IDauthor_id与浏览者IDviewer_id相同并且这篇文章没有被其他作者浏览过的文章。2. 数据表结构与理解首先我们需要明确题目给出的数据表结构------------------------ | Column Name | Type | ------------------------ | article_id | int | | author_id | int | | viewer_id | int | | view_date | date | ------------------------这个表记录了文章浏览的详细信息article_id文章的唯一标识符author_id文章作者的IDviewer_id浏览者的IDview_date浏览发生的日期值得注意的是author_id和viewer_id可能相同作者浏览自己的文章也可能不同其他作者浏览这篇文章。3. 解题思路分析要解决这个问题我们需要分两步思考首先找出所有作者浏览自己文章的记录即author_id viewer_id的记录然后确保这些文章没有被其他作者浏览过即这些文章的article_id在其他记录中不存在author_id ! viewer_id的情况这可以通过SQL中的子查询或者连接查询来实现。下面我将详细介绍几种不同的实现方法。4. 解决方案实现4.1 方法一使用GROUP BY和HAVINGSELECT DISTINCT article_id, author_id, viewer_id FROM Views WHERE author_id viewer_id AND article_id NOT IN ( SELECT article_id FROM Views WHERE author_id ! viewer_id ) ORDER BY author_id;这个方案的思路是先找出所有author_id viewer_id的记录然后排除那些article_id出现在author_id ! viewer_id记录中的文章最后使用DISTINCT去重并按author_id排序4.2 方法二使用GROUP BY和COUNTSELECT article_id, author_id, viewer_id FROM Views WHERE author_id viewer_id GROUP BY article_id, author_id, viewer_id HAVING COUNT(DISTINCT viewer_id) 1 ORDER BY author_id;这个方法利用了GROUP BY和HAVING子句先筛选出作者浏览自己文章的记录按文章ID分组使用HAVING确保每篇文章只有一个浏览者即作者自己4.3 方法三使用自连接SELECT DISTINCT v1.article_id, v1.author_id, v1.viewer_id FROM Views v1 LEFT JOIN Views v2 ON v1.article_id v2.article_id AND v1.author_id ! v2.author_id WHERE v1.author_id v1.viewer_id AND v2.article_id IS NULL ORDER BY v1.author_id;这个方案使用了自连接连接同一个表找出同一篇文章被不同作者浏览的记录通过v2.article_id IS NULL条件确保没有其他作者浏览过这篇文章5. 性能比较与优化建议这三种方法在LeetCode的小数据量下性能差异不大但在实际生产环境中我们需要考虑查询效率方法一使用了NOT IN子查询在数据量大时可能效率较低因为NOT IN通常会导致全表扫描方法二使用了GROUP BY和COUNT在大多数数据库中优化得较好是推荐的做法方法三使用了自连接在适当的索引下性能也不错提示在实际应用中建议在article_id和author_id上建立复合索引可以显著提高查询性能。6. 常见错误与调试技巧在解决这个问题时新手常犯的错误包括忘记去重同一作者可能多次浏览自己的文章需要使用DISTINCT逻辑错误混淆作者浏览自己的文章和文章只被作者浏览这两个条件排序问题题目要求按author_id排序容易被忽略调试技巧可以先分别测试两个条件的查询结果确保每个部分正确使用EXPLAIN分析查询执行计划找出性能瓶颈创建测试用例包括边缘情况如没有符合条件的记录、所有记录都符合条件等7. 实际应用场景延伸虽然这道题目看起来简单但它体现了现实世界中常见的业务需求例如内容分析识别哪些文章主要被作者自己浏览可能质量不高用户行为分析找出只被创作者自己查看的私密内容数据清洗识别可能需要删除的无效浏览记录理解这类问题的解决方法有助于我们在实际工作中处理更复杂的数据分析需求。8. 扩展练习建议为了巩固这个知识点建议尝试以下扩展练习修改查询找出被最多不同作者浏览的文章计算每个作者自己浏览自己文章的次数占总浏览次数的比例找出连续三天都被同一作者浏览的文章这些练习可以帮助你更深入地理解SQL查询和数据聚合的概念。