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 ?

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 ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-22 02:06:12708parcourir

How Can I Retrieve the Newest Items from Multiple Categories Using a Single SQL Query?

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 :

  • Évolutivité : Gère efficacement un certain nombre de catégories.
  • Robustesse : Fonctionne correctement même avec un nombre variable d'articles par catégorie ou des modifications dans la structure des catégories.

Approches alternatives :

  • Variables utilisateur MySQL :

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).

  • Fonctions de fenêtre (MySQL 8.0.3 et versions ultérieures) :

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!

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