1

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

起初,我有一个 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 是管理员用户。

似乎不是很困难,但我还不能编写任何有效的语法。

4

2 回答 2

1
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
于 2013-05-05T16:45:02.640 回答
0

首先,获取您想要的所有行:

SELECT * FROM videos WHERE user_id = ? AND timestamp < ? AND timestamp > ?;

然后,在 PHP 中,假设您使用 mysqli,您可以在结果对象上调用num_rows :

$numVideos = $results->num_rows;

如果您想为多个用户执行此操作,懒惰的方式将是其中foreach包含数据库调用的循环,正确的方法是将时间戳之间的所有结果作为关联数组获取,然后是横向数组。

于 2013-05-05T16:45:18.290 回答