SQL - 按组选择的查询控制记录

时间:2013-04-18 22:50:22

标签: mysql sql group-by greatest-n-per-group

我想在表上使用“group by”执行查询,但是希望对将为每个组选择的记录应用3个规则。这可能吗?使用Mysql SGBD。

idMatch  Country  VideoType VideoId
1        Pt       High      vidZbr  
1        Pt       High      vidXpto
1        Pt       low       vioptr
1        Pt       normal    vidfff
2        Pt       low       vidfgg
2        Pt       normal    vid
3        Pt       low       videop

示例:

SELECT * FROM videos_extended where country = 'Pt' group by idMatch;

通缉分组规则的结果:(如果存在则添加视频'高'如果存在则添加视频'正常'或如果此'idMatch'组的所有其他操作都失败则为'低'

idMatch  Country  VideoType VideoId
1        Pt       High      vidZbr
2        Pt       normal    vid
3        Pt       low       videop

2 个答案:

答案 0 :(得分:1)

这将为行选择两行:“1”,“Pt”,“高”。如果您指定如何选择VideoId,则可以进行改进:

select *
from videos_extended video inner join
(
    select idMatch, Country, 
       min(case VideoType 
           when 'high' then 1 
           when 'normal' then 2
           when 'low' then 3
           else 4 
         end
       ) rank
    from videos_extended
    group by idMatch, Country
) maxType
on maxType.idMatch = video.idMatch 
   and maxType.Country = video.Country
   and maxType.rank = (
      case video.VideoType 
         when 'high' then 1 
         when 'normal' then 2
         when 'low' then 3
         else 4 
      end
   )

答案 1 :(得分:0)

如果VideoType是整数会更好,否则您可以使用CASE或此查询:

SELECT idMatch, Country, VideoType, MAX(VideoId) AS MVidId FROM videos_extended INNER JOIN (SELECT idMatch AS idm, MIN(SUBSTRING(VideoType, 3, 1)) AS vv FROM videos_extended GROUP BY idMatch, Country) AS T ON idMatch = idm AND SUBSTRING(VideoType, 3, 1) = vv GROUP BY idMatch, Country, VideoType