1

私は自分のフォーラムを構築していますが、1つのことに固執しています。

私は2つのテーブルを手に入れました:

  1. Forum_Topics
  2. Forum_Replies

ここで、5つの最新の返信または新しく生成されたトピックを含む行が必要です。

クエリを開始/作成するにはどうすればよいですか?

編集:返信なしで最新のトピックのトピック名も表示する必要があります。返信付きの最後の5つのトピックを取得するのは簡単ですが、トピックなしで取得すると、良い解決策を見つけることができないようです。

助けてくれてありがとう!

4

2 に答える 2

1

たとえばForum_Topics、フィールドを持つテーブルがある場合:

Id
Timestamp
Name

Idは主キーでありTimestamp、エントリの日付と時刻を含む (タイプ タイムスタンプの) ファイルです。

そして、Forum_Repliesフィールドを持つテーブル:

Id
Id_User
Text
Id_Forum_Topics
Timestamp

Idは主キーで、エントリTimestampの日付と時刻を含む (タイプ タイムスタンプの) ファイルです。

また、外部キー制約によって とId_Forum_Topicsの関係があります。Forum_Topic.IdフィールドId_UserとフィールドTextは私の回答では使用されておらず、デモンストレーション目的でのみ存在しています。

注: タイムスタンプの値は、必要に応じて、最終更新時間または作成時間のいずれかになります。


返信のない最新のトピック

あなたのコメントにより、返信のない最新のトピックを作成したいことを理解しました。

返信のない最新のトピックを取得するには、返信のないトピックをクエリし、結果を並べ替えて最新のものを取得する必要があります。

エンジンの制限により、これを COUNT および JOIN 経由で実装するのは困難です。私が知っている最善の解決策は、次のようにクエリをネストすることです。

SELECT Id, Name FROM Forum_Topics
WHERE Id NOT IN
(
    SELECT Id_Forum_Topics AS Id FROM Forum_Replies
)

ここでは、返信のトピックのリストに表示されないトピックを求めています。返信のあるトピックのリストに表示されないトピックのリストです。それは、返信がないトピックです。

もちろん、ORDER BY と LIMIT を使用して、最新のものだけを取得できます。

SELECT Id, Name FROM Forum_Topics
WHERE Id NOT IN
(
    SELECT Id_Forum_Topics AS Id FROM Forum_Replies
)
ORDER BY Timestamp DESC
LIMIT 5

:以下は、コメントの前に理解した質問への回答です。


特定のトピックに対する最新の返信

次に、このクエリを実行できます。

SELECT Id, Id_User, Text, Timestamp FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
ORDER BY Timestamp DESC
Limit 5

上記のクエリは、 で識別されるのエントリに 5 つの最新の返信をForum_TopicsId THE_ID_YOU_ARE_LOOKING_AT返します。

Join を作成することもできます。

SELECT Id, Id_User, Text, Timestamp FROM Forum_Replies
JOIN Formun_Topics ON Forum_Replies.Id_Forum_Topics = Forum_Topics_Id

もちろん、その結合に対してクエリを実行します。

SELECT Id, Id_User, Text, Timestamp FROM Forum_Replies
JOIN Formun_Topics ON Forum_Replies.Id_Forum_Topics = Forum_Topics_Id
WHERE Forum_Topics.Id = THE_ID_YOU_ARE_LOOKING_AT
ORDER BY Forum_Replies.Timestamp DESC
Limit 5

このメソッドは、フィールドの値の正確さに完全に依存することに注意してくださいTimestamp[開発者はそれを確認する権利があります] そして、最新のエントリを提供するために、そのフィールドに対して降順で ORDER BY を使用します (新しいほど値が高いことを意味するため)。 LIMIT を使用して、必要な結果の最大数を設定します。

エントリの日付と時刻を含むフィールドがなければ、どのエントリが新しいかを断言する信頼できる方法はありません [できることはありますが、フィールドがある方が開発と理解が容易です]。


最新の返信のあるトピック

これは、私が提示した最初のクエリと非常によく似ています。フィールドId_Forum_Topicsをクエリし、その値を制限しないでください (WHERE 句を入れないでください)。

SELECT Id_Forum_Topics FROM Forum_Replies
ORDER BY Timestamp DESC
Limit 5

トピックを持つ返信の数

次のようにクエリできます。

SELECT (*) FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT

「新しいトピックを作成しても誰も返信しないと、新しいトピックとして表示されない」とあなたが言ったので、これを使用して、トピックに返信がないかどうか(または 1 つだけ、または5未満...など)。


最新のトピック (返信に関係なく)

TimestampinをForum_Topics使用すると、同様の方法で使用して最新のトピックを取得できます。たとえば、次のようになります。

SELECT Id, Name FROM Forum_Topics ORDER BY Timestamp DESC LIMIT 20

上記のクエリは、最新の 20 件のトピックを提供します。


最後に、これに pagination を実装することを望んでいると思われます。そうであれば、次のことができます。

1) タイムスタンプを使用して、クエリの開始点を示します。

SELECT Id, Id_User, Text FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
AND Timestamp > START_TIMESTAMP
ORDER BY Timestamp DESC
LIMIT 5

START_TIMESTAMP は、結果を取得する日時です。

2) オフセットを LIMIT に設定します。

SELECT Id, Id_User, Text FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
ORDER BY Timestamp DESC
LIMIT 10, 5

この場合、(いつものように) 5 つの最新のエントリが必要であると言っていますが、最新の 10 のエントリの後です。

于 2013-03-23T11:04:26.970 に答える
0
Select * from Forum_Replies left join Forum_Topics on Forum_Replies.topicId = Forum_Topics.id order by Forum_Replies.datefield desc limit 5.
于 2013-03-23T10:59:34.187 に答える