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!