2013-04-18 2 views
-1

Je souhaite effectuer une requête avec "group by" sur table mais je souhaite appliquer 3 règles sur les enregistrements qui seront choisis pour chaque groupe. Est-ce possible? En utilisant Mysql SGBD.SQL - Enregistrement de contrôle de requête choisi par groupe par

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 

Exemple:

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

Résultat recherché pour les règles de regroupement: (ajouter videotype 'High' si elle existe ajouter d'autre videotype 'normal' si existe ou 'faible' si tout le reste échoue pour ce groupe 'idMatch')

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

ajoutez un 'ORDER BY IdMatch, VideoType'. Si 'VideoType' n'est pas une énumération, vous devrez l'emballer avec un' CASE', je suppose. – didierc

+0

Comment les VideoId sont-ils commandés? Dans votre résultat pour "High", vous avez choisi vidZbr. – lunr

Répondre

1

Ceci sélectionnera deux lignes pour la ligne: "1", "Pt", "High". Il peut être amélioré si vous spécifiez comment choisir un 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 
    ) 
+0

Cette technique fonctionne comme un charme! Dans ce cas, je n'ai pas besoin d'un videoid spécifique, peu importe le choix. Merci beaucoup! –

0

Il serait préférable que VideoType soit un entier, sinon vous pouvez CASE ou cette requête:

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 
+0

J'ai marqué la réponse de Lunr comme une solution mais cela devrait marcher aussi –