0

我有两张桌子,PostsCache

Cache表格保存了我应该显示的帖子。帖子 ID 保存在列中(PostIDsCache表格中,以逗号 ( ) 分隔,

这是我的代码:

SELECT * FROM Posts a
WHERE ID IN 
(
  SELECT item FROM Cache AS b
  CROSS APPLY dbo.fnSplit(b.postIDs, ',') 
  WHERE ((b.ownerID = 1) AND (b.magID = 8))
)

fnSplit可以正常工作。

但问题是,帖子的顺序不正确。

例如,如果我们在Cache:中有这个字符串5,1,9,4,10,3,我想从Posts该顺序获取帖子。(第一行应该是 ID 为 5 的帖子,然后是 1,然后是 9,然后是 4,...)

但是我的代码以另一种顺序返回帖子:(表1,3,4,5,9,10中的行顺序Posts

我应该怎么做(纯 SQL)才能按Cache表中指定的顺序获取项目?(在该示例中,我想按此顺序获取帖子5,1,9,4,10,3:)

4

1 回答 1

1

根据您的示例,这应该有效(其中 cacheorder 是您要订购的字段)

SELECT * FROM Posts a 
     inner join 
     ( 
        SELECT item, cacheorder FROM Cache AS b 
        CROSS APPLY dbo.fnSplit(b.postIDs, ',')  
        WHERE ((b.ownerID = 1) AND (b.magID = 8)) 
     ) v
     ON a.ID = v.item
ORDER BY CacheOrder

然而

  • 没有固有的保证记录顺序 - 如果您想要特定顺序,则必须指定它
  • 如果您将 postID 存储在逗号分隔的字段中,则您的数据库设计存在缺陷。
于 2012-08-30T09:08:43.967 回答