按ID和时间戳计数多个表中的行


Count Rows in Multiple Tables by ID and Timestamp

我面临着一个我无法解决的任务。

首先,我有一个mysql数据库,其中我有具体表的每一种类型的用户生成的内容,如博客,照片和视频。这些表是相似的,一般如下所示:

USER_ID | TIMESTAMP | CONTENT_ID | CONTENT
1       | 1364978606|      1     | video_url_1
1       | 1364978606|      2     | video_url_2

每行包含一个已发布的内容。

问题是:我需要在每个表中计算每个USER_ID的"行"数,通过时间戳周期(在两个时间戳之间)进行过滤。之后,我需要通过USER_ID添加行计数(视频中的计数总数加上照片中的计数总数加上博客中的计数总数),并仅显示五个最高结果,不包括一个或两个USER_ID是admin用户。

似乎不是很难,但是我还写不出任何可以工作的语法

select  user_id
,       count(*)
from    (
        select  user_id
        ,       timestamp
        from    video
        union all
        select  user_id
        ,       timestamp
        from    photo
        union all
        select  user_id
        ,       timestamp
        from    blog
        ) SubQueryAlias
where   user_id not in (6,7)  -- assuming admin users 6 and 7
        and timestamp between '2013-01-01' and '2013-04-01'
group by
        user_id
order by
        count(*) desc
limit   5

首先,获取所需的所有行:

SELECT * FROM videos WHERE user_id = ? AND timestamp < ? AND timestamp > ?;
然后,在PHP中,假设您使用mysqli,您可以在结果对象上调用num_rows:
$numVideos = $results->num_rows;

如果你想为多个用户这样做,懒惰的方法是一个foreach循环,其中包含数据库调用,正确的方法是获取时间戳之间的所有结果作为相关数组,然后横向数组。