sql - 我如何使用 SQL 来选择重复记录以及相关项目的计数?

标签 sql database mysql join

我知道这个问题的标题有点令人困惑,所以请耐心等待。 :)

我有一个带有 Person 记录的 (MySQL) 数据库。 Person 也有一个 slug 字段。不幸的是,slug 字段不是唯一的。有许多重复记录,即记录具有不同的 ID 但名字、姓氏和 slug 相同。一个 Person 也可能有 0 篇或多篇相关文章、博客条目和播客剧集。

如果这让您感到困惑,请看下面的结构图:

alt text
(来源:cbstaff.com)

我想生成符合此条件的记录列表:重复记录(即,相同的 slug 字段)对于至少有 1 篇文章、博客条目或播客剧集的人。

我有一个 SQL 查询,它将列出具有相同 slug 字段的所有记录:

SELECT
 id,
 first_name,
 last_name,
 slug,
 COUNT(slug) AS person_records
FROM
 people_person
GROUP BY
 slug
HAVING
 (COUNT(slug) > 1)
ORDER BY
 last_name, first_name, id;

但这包括可能没有至少 1 篇文章、博客条目或播客的人员的记录。我可以调整它以符合第二个标准吗?

编辑:

我更新了数据库图表以简化它并使我在做什么更清楚。 (请注意,一些数据库表名称发生了变化——我之前试图从更高层次看一下结构,但有点不清楚。)

最佳答案

Select P.id, P.first_name, P.last_name, P.slug
From people_person as P
    Join    (
            Select P1.slug
            From people_person As P1
            Where Exists    (
                            Select 1
                            From magazine_author As ma1
                            Where ma1.person_id = P1.id
                            Union All
                            Select 1
                            From podcast_episode_guests As pod1
                            Where pod1.person_id = P1.Id
                            Union All
                            Select 1
                            From blogs_blog_authors As b1
                            Where b1.person_id = P1.Id
                            )
            Group By P1.slug
            Having Count(*) > 1
            ) As dup_slugs
        On dup_slugs.slug = P.slug
Order By P.last_name, P.first_name, P.id

关于sql - 我如何使用 SQL 来选择重复记录以及相关项目的计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2930829/

相关文章:

mysql - 如何使用 dbplyr 连接到 mysql 数据库

java - 根据单个事务中的参数列表选择多行

sql - MS ACCESS 2016 多重联接语法

c++ - navicat之类的数据库管理软件如何从表中选取大量数据

mySQL - 放入列的正确方法(UNION 或其他?)

mysql - 需要帮助构建 MySQL 查询

MySQL - 如何消除具有 NULL 值的结果? (带代码)

php - 随机化数据库中的数据

mysql - Ruby on Rails - rake 数据库 :migrate is not working

mysql - HABTM特殊加盟