是否可以将 SELECT 语句中具有重复列值的记录与 SQL 中的另一条记录合并?

Posted

技术标签:

【中文标题】是否可以将 SELECT 语句中具有重复列值的记录与 SQL 中的另一条记录合并?【英文标题】:Is it possible to consolidate records from a SELECT statement that have duplicate column values with another record in SQL? 【发布时间】:2021-12-22 12:48:22 【问题描述】:

考虑我有以下表格/实体:

Posts

id user_id title content
1 1 Article 1 Lorem ipsum
2 1 Article 1 Lorem ipsum
3 1 Article 2 Lorem ipsum 2
4 2 Article 3 Lorem ipsum

Users

id name
1 John Doe
2 Timothy Fisher

请注意,来自 ID 为 1 的用户的两个帖子具有相同的标题和内容。应用程序级别出现错误,允许用户在过去两次提交帖子,导致“重复”记录。

我希望查询所有帖子,但合并每个用户的帖子,这些帖子具有重复的标题内容。

理想的结果集如下所示:

post_id author_name title content
1 John Doe Article 1 Lorem ipsum
3 John Doe Article 2 Lorem ipsum 2
4 Timothy Fisher Article 3 Lorem ipsum
SELECT
  posts.id as post_id,
  users.name as author_name
  posts.title,
  posts.content
FROM
  posts
INNER JOIN
  users
ON
  posts.user_id = users.id;

查询是否为 John Doe 拉出 12 无关紧要。在实际的数据库中,我有时间戳,所以我很可能只提取最新的。

这可以通过 SQL 实现吗?

【问题讨论】:

【参考方案1】:

mysql 中,您也可以在没有聚合的情况下执行此操作。但我不确定这是否是一个好习惯(更多信息here + 见评论)。

SELECT
  posts.id as post_id,
  users.name as author_name,
  posts.title,
  posts.content
FROM
  posts
INNER JOIN
  users
ON
  posts.user_id = users.id
GROUP BY
  users.name, posts.title, posts.content;

【讨论】:

post id 将是任意的,这不是数据库的好行为。此外,在 MySQL 8 中,默认情况下不推荐使用并关闭该功能。这通常是不好的做法,通常是不必要的,而且是一种烂代码的味道。【参考方案2】:

你可以使用一个虚假的聚合函数和分组

SELECT 
  min(posts.id) as post_id,
  users.name as author_name
  posts.title,
  posts.content
FROM  posts
INNER JOIN  users  ON   posts.user_id = users.id
GROUP BY   users.name, posts.title, posts.content

【讨论】:

我想我什至没有考虑 group by。等等,如果没有聚合功能,这会起作用吗?我可以简单地添加group by posts.title, posts.content,它给了我正确的结果集。 哦,我现在看到 min/max 只是指定要提取哪个 ID,太棒了!比我想象的要容易得多。

以上是关于是否可以将 SELECT 语句中具有重复列值的记录与 SQL 中的另一条记录合并?的主要内容,如果未能解决你的问题,请参考以下文章

将两个具有相似列值的数据框合并在一起[重复]

Ext JS:如何在具有多个列值的网格中查找记录

熊猫将具有相同索引的一列值组合到列表中[重复]

通过具有最大列值的记录过滤 Django 查询

使用名为查询的数据 jpa 返回具有不同列值的行

具有重复值的列上的数据库索引