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 サイトの他の関連記事を参照してください。