我面临着一个我无法解决的任务。
首先,我有一个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
循环,其中包含数据库调用,正确的方法是获取时间戳之间的所有结果作为相关数组,然后横向数组。