Maison >base de données >tutoriel mysql >Comment puis-je sélectionner efficacement les derniers éléments par catégorie dans SQL ?

Comment puis-je sélectionner efficacement les derniers éléments par catégorie dans SQL ?

DDD
DDDoriginal
2025-01-22 02:10:09989parcourir

How Can I Efficiently Select the Latest Items per Category in SQL?

Optimisez les requêtes SQL pour sélectionner efficacement les derniers éléments de chaque catégorie

Le défi d'afficher les derniers projets dans chaque catégorie dans la base de données nécessite une requête SQL efficace. Bien qu'itérer catégorie par catégorie et rechercher les derniers éléments soit une approche simple, il est préférable d'optimiser la requête en réduisant les appels à la base de données.

Max-N-questions par groupe

La tâche d'identification des n derniers enregistrements dans un groupe de catégories est connue sous le nom de problème max-n-per-group, qui est un problème de requête SQL courant.

Solution de connexion externe

En utilisant des jointures externes, nous pouvons obtenir le résultat souhaité :

<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(*) < 4;</code>

Description

Cette requête effectue une jointure externe entre chaque élément (i1) et l'élément plus récent que lui (i2), en considérant uniquement les éléments de la même catégorie. La clause COUNT(*) détermine le nombre d'éléments plus récents pour chaque i1. Les projets comportant moins de quatre projets plus récents deviennent des candidats qualifiés pour notre sélection.

Avantages

Cette solution est flexible et adaptable :

  • Gérez facilement n'importe quel nombre de catégories
  • Ne sera pas affecté par la modification de catégorie
  • Peut gérer des catégories avec un nombre différent d'articles

Alternatives

Une autre solution spécifique à MySQL utilisant des variables utilisateur :

<code class="language-sql">SELECT *
FROM (
    SELECT i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id
    FROM (SELECT @g:=null, @r:=0) AS _init
    CROSS JOIN item i
    ORDER BY i.category_id, i.date_listed
) AS t
WHERE t.rownum <= 4;</code>

Fonctions de la fenêtre SQL

MySQL 8.0.3 a introduit des fonctions de fenêtre, permettant une autre solution efficace :

<code class="language-sql">WITH numbered_item AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id) AS rownum
  FROM item
)
SELECT * FROM numbered_item WHERE rownum <= 4;</code>

Conclusion

En choisissant la méthode de requête appropriée en fonction de votre version spécifique de MySQL et de la structure de votre base de données, vous pouvez optimiser efficacement la sélection des derniers éléments dans chaque catégorie.

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