首頁 >資料庫 >mysql教程 >如何從每個左表條目的 LEFT JOIN 中僅檢索第一行?

如何從每個左表條目的 LEFT JOIN 中僅檢索第一行?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-05 14:27:02326瀏覽

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

取得LEFT JOIN 的第一行

在SQL 中,執行LEFT JOIN 通常會產生左表的多行,其中一個對於右表中的每個對應行。但是,在某些情況下,可能需要僅檢索左表的第一行。

簡化的數據庫結構

考慮以下簡化的數據庫結構:

  • 動態

    id |  title | content
    ----------------------
    1  | Feed 1 | ...
  • 藝術家

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

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

初步嘗試及其局限性

提取文章並僅包含每個feed 的第一位藝術家,通常使用LEFT JOIN。以下查詢表示初步嘗試:
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'

此查詢旨在僅檢索每個 feed ID 的 feeds_artists 表的第一行。但是,它無法有效地工作。

解決方案

要成功提取每個提要的第一位藝術家,可以使用以下查詢:
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
  )

在此修訂後的查詢中,子查詢確保藝術家值代表每個Feed ID 的feeds_artists 表中的第一行。 LIMIT 1 子句在僅選擇第一行方面起著至關重要的作用。

遞增ID 的替代解決方案

如果可以假設藝術家ID 隨著時間的推移而遞增,提出了另一種解決方案:
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
  )

這裡,MIN(artist_id) 子查詢傳回具有最低值的藝術家ID,假設這對應於最早的藝術家。

以上是如何從每個左表條目的 LEFT JOIN 中僅檢索第一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn