私は少しずつ高度なSQLクエリを学習していますが、問題にかなり困惑しています。
news
、author
、images
の3つのテーブルがあります。 news
テーブル(newsID
)の各フィールドはニュースストーリーであり、author
テーブル(authorID
)に作成者が関連付けられ、 images
テーブルに関連付けられた任意の数の画像。各画像には(newsID
)が関連付けられています。したがって、各ストーリーには1人の著者がいますが、複数の画像を含めることができます。
すべてのニュース記事のリストを作成し、画像の1つだけをサムネイル画像として使用したい。問題は、news
アイテムをリストしようとするSQLクエリで、images
アイテムの数ではなく、news
テーブル内のイメージの数に等しい結果が得られることです。 。
ここからどこへ行くべきか分かりません。どんな助けでも大歓迎です。
問題の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
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)
副選択で順序を変更して、探しているニュース行ごとに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 --??
)
Mysqlに3つのテーブルがあり、それを結合したい場合。たとえば、私は3つの表1の学生2の主題3のスコアを持っているので、次に、主題とスコアで学生を結合したいとします。したがって、この構文は次のとおりです。select* from student inner join subject inner join score;