ホームページ  >  記事  >  データベース  >  左側のテーブルエントリごとに LEFT JOIN から最初の行だけを取得するにはどうすればよいですか?

左側のテーブルエントリごとに LEFT JOIN から最初の行だけを取得するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-05 14:27:02245ブラウズ

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

最初の試みとその制限

記事のみを抽出して含める各フィードの最初のアーティストには、通常、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'

このクエリは、フィード 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
  )

この改訂されたクエリでは、サブクエリにより、アーティスト値が各フィード 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。