我有一个包含以下结构的表
view_id | user_agent | view_date | post_id | user_id
我想为每个帖子进行一次查看计数,但是如果特定用户多次阅读某篇文章,它仍被视为1个viewcount。
到目前为止,我已经提出了这个简单的查询
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;
但是它会返回今天每个用户的viewcount数。然后我编辑它,使它成为
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。我只希望它返回每个帖子的viewcount数量,条件是如果有一个用户多次查看该文章,它仍被视为一个viewcount。
我如何实现这一结果?
干杯
答案 0 :(得分:2)
尝试COUNT(DISTINCT member_id)
。
即:
SELECT COUNT(DISTINCT user_id) FROM gw_library_viewcount WHERE ... GROUP BY post_id;
注意,不确定它应该是member_id
还是user_id
,因为您在问题中可以互换使用它。
答案 1 :(得分: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)的非感知组
答案 2 :(得分: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