SQL加入三个表

时间:2011-11-04 23:38:18

标签: sql database join

我正在逐渐学习高级SQL查询,而且我很难解决问题:

我有三个表:newsauthorimagesnews表(newsID)中的每个字段都是一个新闻故事,然后在author表(authorID)中有一个关联的作者,并且可以包含任意数量的图像在images表中关联。每个图像都有关联(newsID)。所以每个故事都有一个作者,但可以有几个图像。

我想列出所有新闻报道,并使用只有一个图像作为缩略图。问题是,我尝试列出news项目的任何sql查询都会给我的结果等于images表中的图像数量,而不是news项目的数量。

我不知道从哪里开始。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分: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

如果您不需要没有任何图像的新闻,可以用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

Database Diagram

答案 1 :(得分:2)

一个选项是添加以下谓词:

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 :(得分:0)

您可以在子选择中修改订单,以获得您要查找的每个新闻行的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 --??
)

答案 3 :(得分:0)

如果你在mysql中有3个表,并且想要将它们连接在一起。例如我有3个表 1名学生 2科目 3分 现在想加入学生主题和得分。所以我们你这个语法: 从学生内部联接主题内部联接分数中选择*;