1

dHello最近の投稿でトピックを並べ替える方法について質問していただけますか?つまり、誰かが投稿したときにトピックを一番上に表示したいということです。表は次のとおりです。

討論

  • id_discution
  • 名前
  • id_category
  • 日にち

コメントコメント

  • id_comment
  • id_user
  • 説明
  • タイプ
  • id_discussion
  • 日付(タイムスタンプ)

これが私のコードですが、トピックの重複がありますが、それらは適切に順序付けられています

select discussion.id_discution, discussion.name, discussion.id_category, 
    discussion.date, discussion.report, comments.id_comment, comments.id_pet_dem_des, 
    comments.date,comments.type 
from discussion,comments 
where discussion.id_discution=comments.id_discussion 
    AND type=3
order by comments.id_comment  desc
4

2 に答える 2

2

GROUP BYディスカッションテーブルの主キー...

SELECT
  discussion.id_discution, discussion.name, discussion.id_category, discussion.date, discussion.report
FROM
  discussion
INNER JOIN
  comments
    ON  discussion.id_discution = comments.id_discussion
    AND type=3
GROUP BY
  discussion.id_discution
ORDER BY
  MAX(comments.date)  desc 

注:この句には、commentsテーブルのデータは含まれていません。SELECT

これは、各ディスカッションを1回だけ表示する必要があるためですが、各ディスカッションには多くのコメントを含めることができます。ディスカッションを何度も表示してコメントを含めるか、コメントデータを結果に含めないかのいずれかです。


ディスカッションが最近コメントされた頻度を示すためにコメントがいくつあるかを示すなど、集計値を含めることができます。COUNT(*)MAX(comments.date)

于 2012-08-14T17:00:47.877 に答える
2

興味のある方のために、すべてのRDBMSプロバイダーで機能するはずの例を次に示します(ただし、明らかにDB2リザーブCOMMENTTYPE...):

SELECT Discussion.discussionId, Discussion.title, 
       Discussion.categoryId, Discussion.startedAt -- + other columns
FROM Discussion
LEFT JOIN (SELECT discussionId, MAX(madeAt) as madeAt
           FROM Comment
           WHERE type = 3
           GROUP BY discussionId) as Most_Recent
ON Most_Recent.discussionId = Discussion.discussionId
ORDER BY COALESCE(Most_Recent.madeAt, Discussion.startedAt) DESC

(SQLFiddleの実例があります。)

その他の注意事項:

  • 物事に「日付」というラベルを付けるだけでなく、具体的にするようにしてください。また、データ型でラベルを付けないでください。明確にするために、などのようなものを使用startedAtします。
  • 通常の方法は使用すること<entity_name> + 'Id'であり、その逆ではないと思います(少なくとも、ほとんどの人はこの形式を期待しています)。
  • エンティティ(テーブル)の名前が単数形であるか複数形であるかを確認してください。これをめぐって聖戦が行われたようですが、私が見た推奨事項のほとんどは、それらを特異にすることを示しています(コレクション全体ではなく、テーブルの行にちなんで名付けられています)。
  • 前述のように、明示的な結合のみを使用し、コンマ区切りのFROM句は使用しないでください(INNER JOIN通常、sの間は問題ありませんが、それ以外では問題が発生するため、そのときは適切な動作を実行してください)。
于 2012-08-14T18:47:25.300 に答える