【问题标题】:How to select distinct from just one table如何从一张表中选择不同的
【发布时间】:2013-05-01 08:09:24
【问题描述】:

我有一个结构如下的表

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。我只希望它返回每个帖子的查看次数,条件是如果有用户多次查看文章,它仍然被视为一次查看次数。

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

干杯

【问题讨论】:

    标签: mysql sql select distinct


    【解决方案1】:

    试试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

    【讨论】:

    • 我的错,应该是 member_id。
    • +1 尽管您可能应该将post_id 包含在选择列表中。
    【解决方案2】:

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

    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) 的无意义组

    【讨论】:

    • 您好,感谢您的回答。我试过你的查询它工作(几乎)我不得不通过删除“MAX(view_date)”group_by来修改它。
    • 很高兴能帮上忙,我已经修改了答案。
    【解决方案3】:

    感谢 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2015-08-25
      相关资源
      最近更新 更多