我正在逐渐学习高级SQL查询,而且我很难解决问题:
我有三个表:news
,author
和images
。 news
表(newsID
)中的每个字段都是一个新闻故事,然后在author
表(authorID
)中有一个关联的作者,并且可以包含任意数量的图像在images
表中关联。每个图像都有关联(newsID
)。所以每个故事都有一个作者,但可以有几个图像。
我想列出所有新闻报道,并使用只有一个图像作为缩略图。问题是,我尝试列出news
项目的任何sql查询都会给我的结果等于images
表中的图像数量,而不是news
项目的数量。
我不知道从哪里开始。任何帮助将不胜感激。
答案 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
答案 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分 现在想加入学生主题和得分。所以我们你这个语法: 从学生内部联接主题内部联接分数中选择*;