Rob*_*tte 14 sql database join
我正在逐渐学习高级SQL查询,而且我很难解决问题:
我有三个表:news,author,和images.newstable(newsID)中的每个字段都是一个新闻故事,然后在author表(authorID)中有一个关联的作者,并且可以在images表中关联任意数量的图像.每个图像都有和关联(newsID).所以每个故事都有一个作者,但可以有几个图像.
我想列出所有新闻故事,并只使用其中一个图像作为缩略图.问题是我试图列出news项目的任何SQL查询给我的结果等于images表中的图像数量而不是news项目的数量.
我不知道从哪里开始.任何帮助将不胜感激.
Kas*_*ash 22
如果有问题的3个表是[ 新闻 ],[ 作者 ]和[ 图像 ],则表示相应的列
派生表方法
您可以使用派生图像表来获取每个新闻的一个图像,然后将其与新闻和作者表连接,如图所示.这已在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
Run Code Online (Sandbox Code Playgroud)
如果您不需要没有任何图像的新闻,可以用INNER JOIN替换LEFT OUTER 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
Run Code Online (Sandbox Code Playgroud)

一种选择是添加以下谓词:
FROM news JOIN images ...
...
WHERE imageID = (SELECT MAX(imageID)
FROM image
WHERE newsID = news.newsID)
Run Code Online (Sandbox Code Playgroud)
请注意,这不包括没有图像的新闻项目。如果您不希望这样,则需要对图像进行左连接并在 WHERE 上添加附加条件:
FROM news LEFT JOIN images ...
...
WHERE imageID IS NULL
OR imageID = (SELECT MAX(imageID)
FROM image
WHERE newsID = news.newsID)
Run Code Online (Sandbox Code Playgroud)