Home >Database >Mysql Tutorial >How to retrieve only the first row from a LEFT JOIN for each left table entry?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-05 14:27:02325browse

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

Getting the First Row of a LEFT JOIN

In SQL, performing a LEFT JOIN typically results in multiple rows for the left table, one for each corresponding row in the right table. However, in certain scenarios, it may be necessary to retrieve only the first row for the left table.

Simplified Database Structure

Consider the following simplified database structure:

  • Feeds

    id |  title | content
    ----------------------
    1  | Feed 1 | ...
  • Artists

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

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

Initial Attempt and Its Limitation

To extract articles and include only the first artist for each feed, a LEFT JOIN is typically employed. The following query represents an initial attempt:

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'

This query aims to retrieve only the first row of the feeds_artists table for each feed ID. However, it fails to work effectively.

Solution

To successfully extract only the first artist for each feed, the following query can be utilized:

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
  )

In this revised query, the subquery ensures that the artist value represents the first row in the feeds_artists table for each feed ID. The LIMIT 1 clause plays a crucial role in selecting only the first row.

Alternative Solution for Incrementing IDs

If the assumption can be made that artist IDs increment over time, an alternative solution is presented:

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
  )

Here, the MIN(artist_id) subquery returns the artist ID with the lowest value, assuming that this corresponds to the earliest artist.

The above is the detailed content of How to retrieve only the first row from a LEFT JOIN for each left table entry?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn