Requête MySQL : sélection des 3 premières lignes de chaque catégorie dans une table
Dans ce scénario, vous disposez d'une table avec de nombreux enregistrements, classés par catégorie. Votre objectif est de récupérer uniquement les trois meilleurs articles de chaque catégorie. Pendant que vous essayiez une solution utilisant les vues et LIMIT, cela a abouti à un nombre limité d'enregistrements.
Pour relever ce défi, il est nécessaire d'utiliser des fonctions analytiques, qui manquent à MySQL. Cependant, vous pouvez obtenir un effet similaire en utilisant des variables :
<code class="sql">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</code>
Cette requête utilise les variables @rownum et @category pour suivre le classement des lignes au sein des catégories. Il commence par définir les deux variables sur des valeurs NULL/vides.
Pour chaque ligne du tableau (alias "t"), il vérifie si la catégorie actuelle diffère de la précédente. Si c'est le cas, il attribue 1 à @rownum ; sinon, il incrémente @rownum de 1. Simultanément, il attribue la catégorie actuelle à @category pour conserver le contexte de comparaison dans les lignes suivantes.
Le résultat est un tableau temporaire qui classe chaque ligne dans sa catégorie. La clause WHERE finale filtre ensuite cette table temporaire pour afficher uniquement les lignes dont le rang est égal ou inférieur à 3.
N'oubliez pas d'ajuster les références de colonnes dans la clause SELECT externe (x.*) pour qu'elles correspondent aux colonnes que vous souhaitez récupérer.
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!