Maison > base de données > tutoriel mysql > Comment récupérer uniquement la première ligne d'un LEFT JOIN pour chaque entrée de table de gauche ?

Comment récupérer uniquement la première ligne d'un LEFT JOIN pour chaque entrée de table de gauche ?

Mary-Kate Olsen
Libérer: 2024-11-05 14:27:02
original
335 Les gens l'ont consulté

How to retrieve only the first row from a LEFT JOIN for each left table entry?

Obtention de la première ligne d'un LEFT JOIN

En SQL, l'exécution d'un LEFT JOIN entraîne généralement plusieurs lignes pour la table de gauche, une pour chaque ligne correspondante dans le tableau de droite. Cependant, dans certains scénarios, il peut être nécessaire de récupérer uniquement la première ligne de la table de gauche.

Structure de base de données simplifiée

Considérez la structure de base de données simplifiée suivante :

  • Flux

    id |  title | content
    ----------------------
    1  | Feed 1 | ...
    Copier après la connexion
  • Artistes

    artist_id | artist_name
    -----------------------
    1         | Artist 1
    2         | Artist 2
    Copier après la connexion
  • feeds_artists

    rel_id | artist_id | feed_id
    ----------------------------
    1      |     1     |    1 
    2      |     2     |    1 
    ...
    Copier après la connexion

Tentative initiale et ses limites

Pour extraire des articles et inclure uniquement le premier artiste pour chaque flux, un LEFT JOIN est généralement utilisé. La requête suivante représente une première tentative :

SELECT *
    FROM feeds 
    LEFT JOIN feeds_artists ON wp_feeds.id = (
        SELECT feeds_artists.feed_id FROM feeds_artists
        WHERE feeds_artists.feed_id = feeds.id 
    LIMIT 1
    )
WHERE feeds.id = '13815'
Copier après la connexion

Cette requête vise à récupérer uniquement la première ligne de la table feeds_artists pour chaque ID de flux. Cependant, cela ne fonctionne pas efficacement.

Solution

Pour réussir à extraire uniquement le premier artiste de chaque flux, la requête suivante peut être utilisée :

SELECT *
  FROM feeds f
  LEFT JOIN artists a ON a.artist_id = (
    SELECT artist_id
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.id
    LIMIT 1
  )
Copier après la connexion

Dans cette requête révisée, la sous-requête garantit que la valeur de l'artiste représente la première ligne de la table feeds_artists pour chaque ID de flux. La clause LIMIT 1 joue un rôle crucial dans la sélection uniquement de la première ligne.

Solution alternative pour incrémenter les identifiants

Si l'on peut supposer que les identifiants d'artiste augmentent avec le temps , une solution alternative est présentée :

SELECT *
  FROM feeds f
  LEFT JOIN artists a ON a.artist_id = (
    SELECT MIN(fa.artist_id) a_id
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.feed_id
  )
Copier après la connexion

Ici, la sous-requête MIN(artist_id) renvoie l'identifiant de l'artiste avec la valeur la plus basse, en supposant que cela correspond au premier artiste.

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