如何从一个表中选择不同的

时间:2013-05-01 08:09:24

标签: mysql sql select distinct

我有一个包含以下结构的表

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。

我如何实现这一结果?

干杯

3 个答案:

答案 0 :(得分:2)

尝试COUNT(DISTINCT member_id)

即:

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

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

例如,请参阅Using DISTINCT and COUNT together in a MySQL Query

答案 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
相关问题