0

我有一个具有以下结构的表

view_id | user_agent | view_date | post_id | user_id

我想对每个帖子进行查看次数,但是如果特定用户多次阅读特定文章,它仍然被视为 1 次查看次数。

到目前为止,我想出了这个简单的查询

SELECT member_id, COUNT(member_id) AS view_count
FROM gw_library_viewcount
WHERE DATE(view_date) = DATE_SUB(DATE(NOW()), INTERVAL 0 DAY)
GROUP BY member_id;

但是,它返回今天每个用户的观看次数。然后我编辑它,让它变成

SELECT COUNT(member_id) AS view_count
FROM gw_library_viewcount
WHERE DATE(view_date) = DATE_SUB(DATE(NOW()), INTERVAL 0 DAY)

这次查询返回 view_count 的总数,但是它包括多个 viewcount。我只希望它返回每个帖子的查看次数,条件是如果有用户多次查看文章,它仍然被视为一次查看次数。

我怎样才能达到这个结果?

干杯

4

3 回答 3

2

试试COUNT(DISTINCT member_id)

那是,:

SELECT COUNT(DISTINCT user_id) FROM gw_library_viewcount WHERE ... GROUP BY post_id;

请注意,不确定它是否应该是member_iduser_id,因为您在问题中可以互换使用它。

例如,请参阅在 MySQL 查询中同时使用 DISTINCT 和 COUNT

于 2013-05-01T08:14:10.570 回答
1

您可以使用子查询来选择唯一的帖子视图,如下所示:

SELECT post_id, COUNT(member_id) AS view_count
FROM (
     SELECT DISTINCT member_id, post_id, MAX(view_date) AS view_date
     FROM gw_library_viewcount
     GROUP BY member_id, post_id
) t
WHERE DATE(view_date) = DATE_SUB(DATE(NOW()), INTERVAL 0 DAY)
GROUP BY post_id

编辑:根据 OP 反馈从子查询中删除了 MAX(view_date) 的无意义组

于 2013-05-01T08:13:56.403 回答
0

感谢 gareththegeek,通过稍微修改他的答案,我可以解决这个问题。这是我正在寻找的查询。

子查询基本上是显示每个成员在特定日期阅读的文章(多次访问/阅读仍然算作一次)

所以它返回这样的结果:

member id | post id | view_date
1 ---------> 1 ------> some_date 
1 ---------> 2 ------> some_date
3 ---------> 1 ------> some_date

等等....

从这里开始,我只是简单地计算用户数量。无论如何,到目前为止,这似乎是有效的。再次感谢 gareththegeek。

SELECT COUNT(member_id) AS view_count
FROM (
    SELECT DISTINCT member_id, post_id, MAX(view_date) AS view_date
    FROM gw_library_viewcount
    WHERE DATE(view_date) = DATE_SUB(DATE(NOW()), INTERVAL 0 DAY)
    GROUP BY member_id, post_id
) AS subquery

*上一个查询

下面的查询结果只有在给定时间间隔为 0 时才有效。当使用其他值(例如 1(表示昨天)进行测试时)给出不准确的结果。

SELECT post_id, COUNT(member_id) AS view_count
FROM (
     SELECT DISTINCT member_id, post_id, MAX(view_date) AS view_date
     FROM gw_library_viewcount
     GROUP BY member_id, post_id
) t
WHERE DATE(view_date) = DATE_SUB(DATE(NOW()), INTERVAL 0 DAY)
GROUP BY post_id
于 2013-05-01T08:39:51.253 回答