Maison >base de données >tutoriel mysql >Comment puis-je récupérer les éléments les plus récents de plusieurs catégories à l'aide d'une seule requête SQL ?
Requête SQL unique pour récupérer les éléments les plus récents de diverses catégories
Cet article présente des solutions SQL efficaces pour récupérer les éléments les plus récents dans plusieurs catégories à l'aide d'une seule requête de base de données, minimisant ainsi les appels à la base de données.
Solution SQL : tirer parti des jointures externes
Le problème du « plus grand n-par-groupe » est résolu avec élégance à l'aide de jointures externes :
<code class="language-sql">SELECT i1.* FROM item i1 LEFT OUTER JOIN item i2 ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id) GROUP BY i1.item_id HAVING COUNT(i2.item_id) < 4;</code>
Cette requête sélectionne efficacement les éléments comportant moins de quatre éléments plus récents dans leurs catégories respectives.
Explication :
La requête joint chaque élément (i1
) à d'autres éléments (i2
) de la même catégorie qui ont un item_id
plus élevé (ce qui signifie qu'ils sont plus récents). La clause HAVING
filtre les éléments contenant trois éléments plus récents ou plus, ne laissant que les quatre éléments les plus récents par catégorie.
Avantages :
Approches alternatives :
Cette méthode utilise les variables définies par l'utilisateur de MySQL pour attribuer des numéros de ligne et identifier les quatre éléments les plus récents par catégorie. (Cette approche est moins portable que la méthode de jointure externe).
MySQL 8.0.3 prend en charge les fonctions de fenêtre SQL standard, offrant une solution plus concise :
<code class="language-sql">WITH numbered_item AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id DESC) AS rownum FROM item ) SELECT * FROM numbered_item WHERE rownum <= 4;</code>
Cette approche divise les éléments par catégorie, attribue des numéros de ligne en fonction de item_id
(par ordre décroissant pour les plus récents en premier), puis sélectionne les quatre premières lignes de chaque partition.
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!