3

ユーザーのコメントを格納するデータベーステーブルがあります。

comments(id, user_id, created_at)

その表から、過去7日間に初めてコメントしたユーザーの数を取得したいと思います。


これが私がこれまでに持っているものです:

SELECT COUNT(DISTINCT `user_id`) 
FROM `comments` 
WHERE `created_at` BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()

これにより、コメントしたユーザーの数がわかりますが、これらのコメントがユーザーにとって最初のものであるかどうかは考慮されません。

4

2 に答える 2

3
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_id2つのコメントが同時に作成される可能性があるため、保持しました。代わりに、各ユーザーの最初のレコードのみを取得する次のことを試すこともできます。これにより、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)))
于 2012-09-03T11:23:16.210 に答える
3
SELECT COUNT(DISTINCT `user_id`) 
FROM comments c1
WHERE created_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()
AND NOT EXISTS 
   (SELECT NULL 
   FROM comments c2 
   where c1.user_id = c2.user_id
   AND c2.create_at < DATE_SUB(NOW(), INTERVAL 7 DAY));
于 2012-09-03T11:22:29.387 に答える