mysql 删除SQL查询中的重复行

jmp7cifd  于 2023-02-28  发布在  Mysql
关注(0)|答案(4)|浏览(151)

首先,这是给我的一个数据库,使用它是一件痛苦的事情。
我有这张table:
| 内容标识符|版本|内容版本ID|别名|发布日期|内容属性名称|内容属性值|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 小行星4507|四个|小行星10369|/实际情况/arkiv/|2014年4月4日|类别名称|1类、2类|
| 小行星4348|三个|小行星10373|/出版商/|二〇一一年五月二十三日|类别名称|1类、2类|
| 小行星4348|四个|小行星|/出版商/|二〇一一年五月二十三日|类别名称|1类、2类|
| 小行星4439|三个|小行星10701|/出版商/|2015年4月8日|类别名称|1类、2类|
| 小行星4439|四个|小行星10702|/出版商/|2015年4月8日|类别名称|1类、2类|
我正在尝试去除列"content_id"中的重复项,并且我已经在stackoverflow上搜索了答案,但是我无法让它与我的SQL查询一起工作。
有人能帮助我完成当前查询吗?

SELECT db_name.contentversion.ContentId as 'content_id',
db_name.contentversion.Version as 'version',
db_name.contentversion.ContentVersionId as 'content_version_id', 
db_name.content.alias as 'alias',
db_name.content.PublishDate as 'publish_date', 
db_name.contentattributes.Name as 'contentattribute_name', 
db_name.contentattributes.Value as 'contentattribute_value'
FROM db_name.contentversion
JOIN db_name.content
ON db_name.content.ContentId = db_name.contentversion.ContentId
JOIN db_name.contentattributes
ON db_name.contentattributes.ContentVersionId = db_name.contentversion.ContentVersionId

编辑
我想我可以使用以下查询来解决这个问题:

SELECT cv.ContentId, cv.Version, cv.ContentVersionId,
db_name.content.alias AS "alias",
db_name.content.PublishDate AS "publish_date", 
db_name.contentattributes.Name AS "contentattribute_name", 
db_name.contentattributes.Value AS "contentattribute_value"
FROM contentversion cv
INNER JOIN (
    SELECT ContentId, MAX(Version) Version
    FROM contentversion
    GROUP BY ContentId
) b ON cv.ContentId = b.ContentId AND cv.Version = b.Version
JOIN db_name.content
ON db_name.content.ContentId = cv.ContentId
JOIN db_name.contentattributes
ON db_name.contentattributes.ContentVersionId = cv.ContentVersionId
jw5wzhpr

jw5wzhpr1#

content_id似乎不是主键,它可以保存在两个不同的版本(即3或4)中。您可能希望获取感兴趣的版本,以便使用WHERE version= ?进行筛选,或者如果版本类型无关紧要,则只使用distinct content_id

t3psigkw

t3psigkw2#

您需要每个内容ID的最大版本。最好的方法可能是横向连接,从MySQL 8.0.14开始就可以使用。

SELECT 
  cv.contentid, 
  cv.version, 
  cv.contentversionid,
  c.alias,
  c.publishdate AS publish_date, 
  ca.name AS contentattribute_name,
  ca.value AS contentattribute_value
FROM db_name.content c
CROSS JOIN LATERAL
(
  SELECT *
  FROM contentversion
  WHERE contentversion.contentid = c.contentid
  ORDER BY contentversion.version DESC
  LIMIT 1
) cv
INNER JOIN db_name.contentattributes ca ON ca.contentversionid = cv.contentversionid
ORDER BY cv.contentid, ca.name;
6fe3ivhb

6fe3ivhb3#

最后一个对我有效的查询是(感谢Thorsten Kettner):

SELECT cv.ContentId, cv.Version, cv.ContentVersionId,
db_name.content.alias AS "alias",
db_name.content.PublishDate AS "publish_date", 
db_name.contentattributes.Name AS "contentattribute_name", 
db_name.contentattributes.Value AS "contentattribute_value"
FROM contentversion cv
INNER JOIN (
    SELECT ContentId, MAX(Version) Version
    FROM contentversion
    GROUP BY ContentId
) b ON cv.ContentId = b.ContentId AND cv.Version = b.Version
JOIN db_name.content
ON db_name.content.ContentId = cv.ContentId
JOIN db_name.contentattributes
ON db_name.contentattributes.ContentVersionId = cv.ContentVersionId
inn6fuwd

inn6fuwd4#

必须从查询中省略versioncontent_version_id列,因为相同的content_id具有不同的值。然后,使用group by子句删除重复的列,如下所示。

SELECT DISTINCT db_name.contentversion.ContentId as content_id,
 db_name.content.alias as alias,
 db_name.content.PublishDate as publish_date, 
 db_name.contentattributes.Name as contentattribute_name, 
 db_name.contentattributes.Value as contentattribute_value
FROM db_name.contentversion
JOIN db_name.content
ON db_name.content.ContentId = db_name.contentversion.ContentId;

相关问题