Maison >base de données >tutoriel mysql >Comment récupérer efficacement uniquement la ligne la plus récente dans un MySQL JOIN avec pagination ?

Comment récupérer efficacement uniquement la ligne la plus récente dans un MySQL JOIN avec pagination ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-03 13:47:40582parcourir

How to Efficiently Retrieve Only the Most Recent Row in a MySQL JOIN with Pagination?

Récupération de la ligne la plus récente uniquement dans un MySQL JOIN avec pagination

Lorsque vous traitez des tables de données historiques comme customer_data, il est souvent souhaitable de rejoindre uniquement la ligne la plus récente vers une autre table, tout en gérant également la pagination.

Original Requête :

SELECT *, CONCAT(title,' ',forename,' ',surname) AS name
FROM customer c
INNER JOIN customer_data d on c.customer_id=d.customer_id
WHERE name LIKE '%Smith%' LIMIT 10, 20

JOIN optimisé avec la clause WHERE :

Pour récupérer uniquement la ligne la plus récente pour chaque client, ajoutez la condition suivante au WHERE clause :

...
WHERE
  d.customer_data_id IN (
    SELECT MAX(customer_data_id)
    FROM customer_data
    WHERE customer_id = c.customer_id
  )
...

Indexation alternative Solution :

Pour améliorer les performances, en particulier dans les requêtes lourdes, pensez à créer un index sur les colonnes (customer_id, customer_data_id) dans customer_data. Cela permet à MySQL d'identifier rapidement la ligne la plus récente pour chaque client.

Exemple de clause WHERE avec index :

...
WHERE
  d.customer_id = c.customer_id AND
  d.customer_data_id = (
    SELECT MAX(customer_data_id)
    FROM customer_data
    WHERE customer_id = c.customer_id
  )
...

CONCAT avec LIKE :

Oui, utiliser CONCAT avec LIKE est une méthode valide pour rechercher sur plusieurs champs concaténés ensemble. Ceci est particulièrement utile lorsque les colonnes d'origine ne sont pas indexées et entraînerait normalement une analyse complète de la table.

Considérations supplémentaires :

  • Pagination : Les clauses LIMIT et OFFSET doivent être appliquées à la requête externe (c'est-à-dire en dehors de la sous-requête).
  • JOIN Type : INNER JOIN est généralement correct pour récupérer toutes les lignes correspondantes des deux tables. Cependant, vous souhaiterez peut-être expérimenter d'autres types JOIN pour optimiser les performances en fonction de votre structure de données spécifique.

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