Maison  >  Article  >  base de données  >  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
Mary-Kate Olsenoriginal
2024-11-05 14:27:02245parcourir

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 | ...
  • Artistes

    artist_id | artist_name
    -----------------------
    1         | Artist 1
    2         | Artist 2
  • feeds_artists

    rel_id | artist_id | feed_id
    ----------------------------
    1      |     1     |    1 
    2      |     2     |    1 
    ...

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'

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
  )

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
  )

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!

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