2012-08-30 68 views
0

我有兩個表,PostsCache以正確的順序獲取從其他表中檢索的ID的行

Cache表保存與帖子應該顯示。帖子ID是(在CachePostIDs保存在一列,用逗號(,)分離

這是我的代碼:。

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工作正常

但問題是,帖子的順序不正確

例如,如果我們有這個字符串在Cache5,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

回答

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 

然而

  • 有記錄沒有內在保證的順序 - 如果你想要一個特定的順序,你必須指定它
  • 如果你存儲在一個逗號分隔場postIDs,數據庫設計是有缺陷的。
+0

我的表中沒有任何名爲'cacheorder'的字段。我想用'b.postIDs'字符串中的順序來訂購商品。 –

+1

然後,您需要重寫您的fnSplit,以便它返回訂單。 – podiluska

+0

沒有其他方法嗎? (由於fnSplit以正確的順序返回行) –

相關問題