mysql 如何只返回标识符较低的重复行

xkftehaa  于 12个月前  发布在  Mysql
关注(0)|答案(2)|浏览(157)

我有一个包含多个重复记录的表。该表有4列,例如idpost_idpost_keypost_value。我能够返回与下面的查询重复的条目。

SELECT *
FROM table1 ppm
WHERE ppm.post_key = 'some_value'
  AND ppm.post_id IN (SELECT pm.post_id 
                      FROM table1 pm
                      WHERE pm.post_key = 'some_value'
                      GROUP BY pm.post_id 
                      HAVING COUNT(pm.post_id) > 1)

它会生成如下输出:
| id| post_id|柱键|后值|
| - -----|- -----|- -----|- -----|
| 1| 2| key1|价值1|
| 2| 2| key1|价值观2|
| 3| 2| key1|价值3|
因为可能存在多个重复的post_id,例如2,我想只显示较低的id值。使用上面的例子,它只会显示下面的结果,因为3是比前面的值更大的数字。
| id| post_id|柱键|后值|
| - -----|- -----|- -----|- -----|
| 1| 2| key1|价值1|
| 2| 2| key1|价值观2|
如何返回具有较低id的重复行?
当前查询返回所有重复行。我希望只有id值较低的重复行。

sxpgvts3

sxpgvts31#

使用自联接来检查在ON条件下ID是否更低。

SELECT DISTINCT t1.*
FROM table1 AS t1
JOIN table2 AS t2 ON t1.post_id = t2.post_id AND t1.id < t2.id
WHERE t1.post_key = 'some_value' AND t2.post_key = 'some_value'

我添加了DISTINCT,以防有多个副本,这将只返回每对中的一个。

du7egjpx

du7egjpx2#

SELECT id, post_id, post_key, post_value
FROM (
    select *,
       row_number() over (partition by post_id order by id desc) rn
    from `table1`
) t
WHERE rn <> 1

看它在这里工作:
https://dbfiddle.uk/QZf1xFN8

相关问题