Maison  >  Article  >  base de données  >  Comment obtenir les 3 premières lignes de chaque catégorie dans MySQL sans fonctions analytiques ?

Comment obtenir les 3 premières lignes de chaque catégorie dans MySQL sans fonctions analytiques ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 10:34:27804parcourir

How to Get the Top 3 Rows From Each Category in MySQL Without Analytic Functions?

Sélection des 3 premières lignes de chaque catégorie dans MySql

Dans une table avec de nombreux enregistrements et une colonne de catégorie, la tâche se pose de récupérer uniquement les deux meilleurs articles de chaque catégorie. Pour y parvenir, l'utilisateur tente dans un premier temps de créer une vue limitrows, limitant le nombre de lignes récupérées à deux par catégorie. Cependant, cette approche s'avère insuffisante.

Comprendre les fonctions analytiques

Le résultat souhaité nécessite l'utilisation de fonctions analytiques/fenêtrage/classement. Ces fonctions, que MySQL ne prend pas automatiquement en charge, peuvent être approximées à l'aide de variables.

Émulation de fonctions analytiques

Le code suivant émule des fonctions analytiques :

SELECT x.*
FROM (SELECT t.*,
               CASE 
                 WHEN @category != t.category THEN @rownum := 1 
                 ELSE @rownum := @rownum + 1 
               END AS rank,
               @category := t.category AS var_category
          FROM TBL_ARTIKUJT t
          JOIN (SELECT @rownum := NULL, @category := '') r
      ORDER BY t.category) x
WHERE x.rank <= 3

Les variables @rownum et @category sont utilisées respectivement pour garder une trace du numéro de ligne et de la catégorie actuelle. En utilisant ces variables, le classement de chaque ligne dans sa catégorie est déterminé et celles parmi les 3 premiers rangs sont sélectionnées.

Personnalisation de l'ensemble de résultats

Pour garantir que seules les colonnes souhaitées sont renvoyées, spécifiez les colonnes requises dans l'instruction SELECT, comme démontré ci-dessous :

SELECT x.articleid, x.title
FROM (SELECT t.*,
               CASE 
                 WHEN @category != t.category THEN @rownum := 1 
                 ELSE @rownum := @rownum + 1 
               END AS rank,
               @category := t.category AS var_category
          FROM TBL_ARTIKUJT t
          JOIN (SELECT @rownum := NULL, @category := '') r
      ORDER BY t.category) x
WHERE x.rank <= 3

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn