按多列mysql获取记录组

按多列mysql获取记录组,mysql,sql,Mysql,Sql,这是我的桌子结构 comment_file_id comment_id attachement_id source created_by 33 203 42 IN 101 35 203 46 OUT 101 36 203 42 OUT 1

这是我的桌子结构

comment_file_id  comment_id  attachement_id  source  created_by
   33           203               42          IN        101
   35           203               46          OUT       101
   36           203               42          OUT       101
   37           203               42          OUT       101
我只想获得3条记录,因为与附件_id 42关联的记录对于源输出是重复的,所以oi必须排除这些记录

    select * 
      from comments 
     where comment_id = 203 
     GROUP 
        BY source
         , created_by 
         , attachement_id ;
但是获取错误时使用min


如果您使用的是MySQL 8+,那么ROW_NUMBER在这里很有用。我们可以将您的查询表述为不受重复约束的所有记录的联合,以及不被视为重复的单个记录:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY comment_file_id) rn
    FROM comments
    WHERE comment_id = 203 AND attachement_id = 42 AND source = 'OUT'
)

SELECT comment_file_id, comment_id, attachement_id, source, created_by
FROM comments
WHERE comment_id = 203 AND (attachement_id <> 42 OR source <> 'OUT')
UNION ALL
SELECT comment_file_id, comment_id, attachement_id, source, created_by
FROM cte
WHERE rn = 1;

无法在限制3上绑定它可能超过n或m@VivekSahni您对该示例的预期输出是什么data@ZaynulAbadinTuhin有时,最好在发布自己的答案之前获得该问题的答案:-不是我的downvoteThis恰好适用于提供的示例数据,但它会从整个表中删除重复项,OP可能不需要它。@Zaynulabadinthin工作正常,但我想从表t中按注释id、附件id、源获取所有记录,如选择mincomment\u file\u id作为注释文件id t.*,我是如何做到这一点的?请提供您的样品output@Fahmi我想排除最后一条记录,即注释文件id 37,因为存在附件id为42的记录,源代码在第3位record@VivekSahni好的……但是你想保留哪些副本?
WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY comment_file_id) rn
    FROM comments
    WHERE comment_id = 203 AND attachement_id = 42 AND source = 'OUT'
)

SELECT comment_file_id, comment_id, attachement_id, source, created_by
FROM comments
WHERE comment_id = 203 AND (attachement_id <> 42 OR source <> 'OUT')
UNION ALL
SELECT comment_file_id, comment_id, attachement_id, source, created_by
FROM cte
WHERE rn = 1;