Maison > base de données > tutoriel mysql > 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
Libérer: 2024-10-30 10:34:27
original
872 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal