0

私は2つのテーブルを持っていPostsますCache.

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

Cacheテーブルで指定された順序でアイテムを取得するにはどうすればよいですか (純粋な SQL) ? (その例では、次の順序で投稿を取得したい: 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 に答える