Maison > base de données > tutoriel mysql > le corps du texte

Comment joindre efficacement des tables avec LIMIT 1 sur une table jointe ?

Linda Hamilton
Libérer: 2024-11-15 21:05:02
original
605 Les gens l'ont consulté

How to Efficiently Join Tables with LIMIT 1 on a Joined Table?

Joindre efficacement des tables avec LIMITE 1 sur une table jointe

Problème :

Joindre deux tables tout en n'en récupérant qu'une seule enregistrement de la table jointe pour chaque enregistrement de la table principale, en particulier dans les contextes où plusieurs enregistrements existent dans la table jointe table.

SOLUTION UTILISANT UNE SOUS-REQUÊTE :

Cette approche contourne efficacement l'erreur qui survient lors de la sélection de plusieurs colonnes dans la table jointe tout en limitant les résultats à un seul enregistrement. La clé consiste à utiliser une sous-requête pour récupérer la clé primaire de l'enregistrement souhaité. La sous-requête est ensuite utilisée pour filtrer la table jointe dans la requête principale.

SELECT
c.id,
c.title,
p.id AS product_id,
p.title AS product_title
FROM categories AS c
JOIN products AS p ON
p.id = (                                 --- the PRIMARY KEY
SELECT p1.id FROM products AS p1
WHERE c.id=p1.category_id
ORDER BY p1.id LIMIT 1
)
Copier après la connexion

Cette requête démontre des performances supérieures, même lorsque la table jointe contient un nombre d'enregistrements nettement plus important que la table principale.

Approches alternatives :

Bien que l'approche par sous-requête soit généralement optimale, il existe des méthodes alternatives disponibles. Cependant, il est important de considérer leurs implications potentielles en termes de performances.

  • Utilisation de GROUP BY et de l'agrégation de tableaux (LIMIT NOT Applicable) :
SELECT
  id,
  category_title,
  (array_agg(product_title))[1]  
FROM
    (SELECT c.id, c.title AS category_title, p.id AS product_id, p.title AS product_title
    FROM categories AS c
    JOIN products AS p ON c.id = p.category_id
    ORDER BY c.id ASC) AS a 
GROUP BY id, category_title;
Copier après la connexion
  • Utilisation de CROSS JOIN et ROW_NUMBER (LIMIT NOT Applicable):
SELECT
  c.id,
  c.title,
  p.id AS product_id,
  p.title AS product_title
FROM categories AS c
CROSS JOIN (SELECT product_id, title, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY id) AS rn
            FROM products) AS p
WHERE rn = 1;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal