たとえば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_Topics
Id
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未満...など)。
最新のトピック (返信に関係なく)
Timestamp
inを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 のエントリの後です。