希望有人能够轻松思考,但我肯定会被困在这里!在我的网站上,我允许用户发布Feed /消息,并允许他们按照自己的意愿切换成员资格。我想根据发布每个Feed的成员资格来运行一些统计信息,而不仅仅是他们当前的成员资格。例如,我想看看每个会员发布了多少个Feed。现在,我可以运行计数并加入用户,订阅源和成员资格表,但这会根据每个用户当前的成员资格计算每个订阅源,这不一定是他们发布时的成员资格。我希望这是有道理的。
由于我们的数据库中已有许多供稿,因此我无法在供稿表中添加一列,以显示发布的用户所属的成员资格类型。这是我的表(缩写)看起来是否有人查询如何执行此操作:
用户表
id username membershipid
1 John Doe 1
会员资格表
id membershipname
1 Membership #1
2 Membership #2
3 Membership #3
会员资格历史表
id membershipsid usersid unix_timestamp
1 1 1 1476635544.33
2 2 1 1476641890.11
3 3 1 1476642124.2
4 1 1 1476642161.51
供稿表
id unix_timestamp usersid
1 1476641716.809361 1
2 1476641783.866863 1
3 1476641822.779324 1
4 1476641904.066237 1
5 1476641973.767174 1
6 1476642182.821472 1
很难快速看到unix_timestamps ......但我想要的是一个解决方案来提供这个:
按会员表计算的Feed数量
membershipid feedcount
1 4
2 2
3 0
到目前为止,我已经尝试了很多东西,但它们最终都提供了用户拥有的当前成员资格......例如:
SELECT
a.MembershipName MembershipName,
COUNT(*) Feeds
FROM (SELECT
m.membership_name MembershipName
FROM feeds f
JOIN users u ON f.usersid = u.id
JOIN memberships m ON u.membership_id = m.id
GROUP BY f.id
ORDER BY f.unix_timestamp DESC) a
GROUP BY a.MembershipName
ORDER BY a.MembershipName
但这对会员历史表没有任何作用,所以我的输出表是:
按会员表计算的Feed数量
membershipid feedcount
1 6
2 0
3 0
这是错误的,因为它应该是1-> 4,2-> 2&如上表所示,3-> 0。任何人的想法?
答案 0 :(得分:1)
注意#1 - 您要执行的查询非常昂贵,我的建议是在发布Feed时将当前的membershipsid保存到Feed表中
注意#2 - 下面的查询假设成员资格历史记录始终每个用户至少包含一个条目,而不仅仅是在更改时(因此第一次分配历史记录时) )
我认为您的解决方案的方式是"如何在时间X查询会员ID值?",答案很简单,它是最近更改的值,在时间X之前:
SELECT h.membershipsid
FROM membershipshistory h
WHERE h.usersid = {USERID} AND h.unix_timestamp < {X}
ORDER BY h.unix_timestamp DESC
LIMIT 1
下一步是&#34;如何列出所有供稿以及会员资格ID,其中X是发布供稿的时间?
SELECT
feeds.id,
feeds.usersid,
(
SELECT h.membershipsid
FROM membershipshistory h
WHERE h.usersid = feeds.usersid AND h.unix_timestamp < feeds.unix_timestamp
ORDER BY h.unix_timestamp DESC
LIMIT 1
) AS historical_membershipsid
FROM
feeds
哪些输出(来自我的样本数据):
+------+---------+--------------------------+
| id | usersid | historical_membershipsid |
+------+---------+--------------------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
+------+---------+--------------------------+
从这一点开始,你的解决方案应该是微不足道的,只需将整个查询放在一个视图或子查询中,并按history_membershipsid分组,但请记住它非常昂贵。
<强>更新强>
如果最终解决方案不那么明显,我很抱歉,这是使用历史数据计算每个会员资料的最终查询:
SELECT
hf.historical_membershipsid AS membershipsid,
COUNT(hf.id) AS feedcount
FROM (
SELECT
feeds.id,
feeds.usersid,
(
SELECT h.membershipsid
FROM membershipshistory h
WHERE h.usersid = feeds.usersid AND h.unix_timestamp < feeds.unix_timestamp
ORDER BY h.unix_timestamp DESC
LIMIT 1
) AS historical_membershipsid
FROM
feeds) AS hf
GROUP BY
hf.id