SELECT COUNT(DISTINCT user_id)
FROM comments AS c1
WHERE c1.created_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()
AND NOT EXISTS (SELECT 1 FROM comments AS c2
WHERE c2.user_id = c1.user_id AND c2.created_at < c1.created_at)
このNOT EXISTS
句は、同じuser_idに以前にcreated_atのレコードがあるかどうかをチェックします。もしそうなら、それは彼らがコメントするのはこれが初めてではないことを意味するので、私たちはこの記録を割り引くべきです。
DISTINCT user_id
2つのコメントが同時に作成される可能性があるため、保持しました。代わりに、各ユーザーの最初のレコードのみを取得する次のことを試すこともできます。これにより、DISTINCTを廃止できますが、どちらが最適かわかりません。
SELECT COUNT(*)
FROM comments AS c1
WHERE c1.created_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()
AND NOT EXISTS (SELECT 1 FROM comments AS c2
WHERE c2.user_id = c1.user_id
AND (c2.created_at < c1.created_at
OR (c2.created_at = c1.created_at AND c2.id < c1.id)))