0

私は次の表を持っています。

comment    postid    userid            tempid

c1         199       100003052455644    89
c2         193       100003052455644    2
c4         199       100003052455644    82
c5         198       100003052455644    5
c6         199       1097517748         65

ここで、データが最初に列に従って降順で並べ替えられ、次に行が挿入された順序で並べ替えられるようにデータを取得したいと考えました。今、postidpostid が降順で並べ替えられている値を取得すると、このような結果。

comment    postid    userid            tempid

c6         199       1097517748         65
c4         199       100003052455644    69
c1         199       100003052455644    82
c5         198       100003052455644    5
c2         193       100003052455644    2

ご覧のとおり、最後にコメントしたユーザー ID が最初の位置に表示されています。投稿 ID199では、列を降順で並べ替えることでこの問題に遭遇しましtempidた。しかし、tempid 列を使用しない方法はありますか?テーブルは非常にすぐにいっぱいになり、自動インクリメント列はすぐにいっぱいになるので、将来この一時的な列を削除する予定です。

現在、正しい結果が得られる次のクエリを使用しています。

 SELECT comments.comment,comments.postid,user.name,comments.userid,comments.tempid 
 FROM
  user
   INNER JOIN comments ON user.userid=comments.userid
   INNER JOIN posts ON posts.postID = comments.postid
 WHERE 
 comments.postid <=  
 (SELECT MAX(postid) FROM
   (
     SELECT wall.postid FROM wall,posts WHERE  
     wall.postid = posts.postid AND posts.userid=?
     ORDER BY wall.postid DESC LIMIT 10 OFFSET ?
   )sq1
 )

 AND
 comments.postid >= 
 (SELECT MIN(postid) FROM
  (
    SELECT wall.postid FROM wall,posts WHERE
    wall.postid = posts.postid AND posts.userid=?
    ORDER BY wall.postid DESC LIMIT 10 OFFSET ?
  )sq2
 ) 

 AND
 posts.userid = ? 
 ORDER BY comments.postid DESC,comments.tempid DESC;

comments.tempid DESC最後の行だけが重要です。句を削除しても同じ結果が得られます。出来ますか?

4

1 に答える 1

0

コメントを削除しながら同じ結果を達成したい。tempidDESC句。出来ますか?

はい。整数の代わりにタイムスタンプを持つ別の列を追加できます。ただし、2つの行のタイムスタンプが同じになる可能性があるため、完全なソリューションではありません。

しかし、このテーブルは非常に速く埋められ、自動インクリメント列はすぐに埋められるので、tempid列を使用しない方法はありますか?将来、このtempid列を削除する予定です。このようにするのは良い考えですこれに対する他の解決策はありますか?

自動インクリメント列は、タイプにすることができますbigint。これで十分です。

関連している

于 2012-10-22T09:20:30.803 に答える