web-dev-qa-db-ja.com

SQLは3つのテーブルを結合します

私は少しずつ高度なSQLクエリを学習していますが、問題にかなり困惑しています。

newsauthorimagesの3つのテーブルがあります。 newsテーブル(newsID)の各フィールドはニュースストーリーであり、authorテーブル(authorID)に作成者が関連付けられ、 imagesテーブルに関連付けられた任意の数の画像。各画像には(newsID)が関連付けられています。したがって、各ストーリーには1人の著者がいますが、複数の画像を含めることができます。

すべてのニュース記事のリストを作成し、画像の1つだけをサムネイル画像として使用したい。問題は、newsアイテムをリストしようとするSQLクエリで、imagesアイテムの数ではなく、newsテーブル内のイメージの数に等しい結果が得られることです。 。

ここからどこへ行くべきか分かりません。どんな助けでも大歓迎です。

14

問題の3つのテーブルが[news]、[author]の場合および[image]と適切な列、

派生テーブルアプローチ

派生画像テーブルを使用して、ニュースごとに1つの画像を取得し、それをnewsおよびauthor表のように表示されます。これはSQL Serverで作成およびテストされています。

SELECT  
      N.[newsStoryTitle]
        ,A.authorName
        ,I.imageData1
  FROM [news] N
  LEFT OUTER JOIN author A ON A.newsID = N.newsID
  LEFT OUTER JOIN 
    (
    SELECT newsID, MAX(imageData) AS imageData1 FROM [image] 
    GROUP BY newsID
    )  AS I ON I.newsID = N.newsID
ORDER BY N.newsID

画像なしのニュースが必要ない場合は、LEFT OUTER JOINをINNER JOINに置き換えることができます。

相関サブクエリアプローチ(Marcelo Cantosの提案どおり)

ImageDataがテキストまたはイメージとして格納されている場合、派生テーブルのMAXは機能しません。その場合、次のような相関サブクエリを使用できます。

SELECT  N.newsStoryTitle ,
        A.authorName ,
        I.imageData
FROM    dbo.news N
        INNER JOIN dbo.author A ON N.newsID = A.newsID
        INNER JOIN dbo.image I ON N.newsID = I.newsID
WHERE   imageID = ( SELECT  MAX(imageID)
                    FROM    dbo.image
                    WHERE   newsID = N.newsID
                  )
ORDER BY n.newsID

Database Diagram

22
Kash

1つのオプションは、次の述語を追加することです。

FROM news JOIN images ...
...
WHERE imageID = (SELECT MAX(imageID)
                   FROM image
                  WHERE newsID = news.newsID)

これは画像のないニュース項目を除外することに注意してください。これが必要ない場合は、画像の左結合とWHEREの追加条件が必要です。

FROM news LEFT JOIN images ...
...
WHERE imageID IS NULL
   OR imageID = (SELECT MAX(imageID)
                   FROM image
                  WHERE newsID = news.newsID)
2
Marcelo Cantos

副選択で順序を変更して、探しているニュース行ごとに1つの画像を取得できます...

select
....
from news n
left outer join images i on i.imageID = (
    select top 1 i2.imageID 
    from images i2 
    where i2.newsID = n.newsID
    order by --??
)
0
dotjoe

Mysqlに3つのテーブルがあり、それを結合したい場合。たとえば、私は3つの表1の学生2の主題3のスコアを持っているので、次に、主題とスコアで学生を結合したいとします。したがって、この構文は次のとおりです。select* from student inner join subject inner join score;

0
user2147772