加入一个充满网址的表后,如何为每一行获取“最后一个网址”

时间:2014-07-20 16:20:18

标签: sql sql-server

我在下面链接的照片中有两张表,我使用此查询加入这些表:

declare @ID INT = 1

select *
from PhotoAlbum_Table,Photo_Table
where PhotoAlbum_Table.ID=@ID 
  and ( PhotoAlbum_Table.PhotoAlbumID=Photo_Table.PhotoAlbumID)

但我需要在加入这些表后删除一些记录(具有相同主键的记录)但不知道如何,我在照片上标记了它们。

我想要用户的所有相册,以及他们上传到该相册的最后一张photoUrl。

链接到图片:http://oi58.tinypic.com/54uosj.jpg

2 个答案:

答案 0 :(得分:1)

您需要将选择组合在一起。

DECLARE @ID int = 1;
SELECT <Choose the specific items you want> FROM PhotoAlbum_Table AS a
INNER JOIN Photo_Table AS p ON a.PhotoAlbumID = p.PhotoAlbumID
WHERE a.ID = @ID;
GROUP BY <The specific items> --Add this line

修改

根据我将使用的新信息。

DECLARE @ID int = 1;
WITH cte (
    PhotoAlbumID,
    PhotoID,
    PhotoAlbumDate,
    PhotoAlbumName,
    PrivacyID
) AS (
    SELECT a.PhotoAlbumID,
        MAX(p.PhotoID)
        a.PhotoAlbumDate, 
        a.PhotoAlbumName, 
        a.PrivacyID
    FROM PhotoAlbum_Table AS a
    INNER JOIN Photo_Table AS p ON a.PhotoAlbumID = p.PhotoAlbumID
    WHERE a.ID = @ID;
    GROUP BY a.PhotoAlbumID, 
        a.PhotoAlbumDate, 
        a.PhotoAlbumName, 
        a.PrivacyID
)
SELECT cte.*, u.PhotoUrl FROM cte
INNER JOIN Photo_Table AS u ON cte.PhotoID = u.PhotoID;

答案 1 :(得分:0)

嗯,这种类型的查询通常不容易,至少是第一次。这是因为在定义诸如&#34;最新的URL&#34;之类的东西时,SQL语言没有帮助,它很容易获取&#34;最新的日期&#34;,或者#34;最大的ID&#34; (假设你有一些自动编号)。

但对于&#34;最新的网址&#34;你必须基本上把问题分成&#34;最新的URL修改日期&#34;然后是##;匹配最新日期&#34;。

的网址

但是,如果您在相对较新的sql server(2008+)上工作,可以在行编号和分区功能的帮助下将其写下来。如果您选择现在正在执行的所有操作,并在URL Date上选择rownumber(),那么您将能够选择rownumber == 1的行。

简而言之:

  • 编写类似于现在的选择加入
  • 为其添加rownumbering,partitioned by albumIdordered descending by photoDate
  • 然后,你将不得不用另一个查询包装所有这些
  • 会按where rownumber = 1
  • 之类的内容过滤行

在粗略的草图中,它看起来像:

select *
from
(
   select
     al.albumid,
     ...
     ph.photourl,
     rownumber() over (
          partition by al.albumid
          order by ph.photoDate
     ) as rn
   from albums al
   join photos ph on ph.album = al.albumid
) 
where tmp.rn = 1

但这是一个草图,根据您的需要进行调整