SQL加入三个表

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)

数据库图


Mar*_*tos 2

一种选择是添加以下谓词:

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)