编辑:我已经把它放在 PHP 和 MySQL 类别中,因为我相信可能有一种方法可以使用多个查询来执行此操作,并使用 PHP 将它们绑定(bind)在一起。我宁愿不这样做...但归根结底,解决方案就是解决方案...
希望这对某些人来说很容易思考,但我肯定被困在这里了!在我的网站上,我允许用户发布提要/消息,并且他们可以根据需要随时切换成员(member)资格。我想根据他们发布每个 feed 时的成员(member)资格来运行一些统计数据,而不仅仅是他们当前的成员(member)资格。例如,我想查看每个成员(member)发布了多少个提要。现在,我可以计算并加入用户、订阅源和成员(member)表,但这会根据每个用户当前的成员(member)资格计算每个用户的每个订阅源,这不一定是他们发布时的成员(member)资格。我希望这是有道理的。
由于我们的数据库中已有许多提要,我无法在提要表中添加一列来显示发帖用户的成员(member)类型。这是我的表(缩写)的样子,看看是否有人对如何执行此操作有疑问:
用户表
id username membershipid
1 John Doe 1
成员(member)表
id membershipname
1 Membership #1
2 Membership #2
3 Membership #3
成员(member)历史表
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 快速查看...但我想要的是提供这样的解决方案:
按成员表的提要计数
membershipid feedcount
1 4
2 2
3 0
到目前为止,我已经尝试了很多方法,但它们最终都提供了用户拥有的当前成员(member)资格...例如:
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
但这对成员历史表没有任何作用,所以我的输出表是:
按成员表的提要计数
membershipid feedcount
1 6
2 0
3 0
这是错误的,因为它应该是 1->4、2->2 和 3->0,如上表所示。任何人有什么想法吗?
最佳答案
注意 #1 - 您要执行的查询非常昂贵,我的建议是在发布提要时将当前的 membershipid 简单地保存到提要表中
注 #2 - 下面的查询假设成员(member)历史记录总是包含每个用户至少一个条目,而不仅仅是在它被更改时(所以第一次分配历史记录时创建)
我认为您的解决方案是“如何查询时间 X 的成员(member) 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
接下来是“我如何列出所有提要以及成员(member) 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
哪些输出(来 self 的示例数据):
+------+---------+--------------------------+
| id | usersid | historical_membershipsid |
+------+---------+--------------------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
+------+---------+--------------------------+
从这个开始,您的解决方案应该很简单,只需将整个查询放在 View 或子查询中并按 historical_membershipsid 分组,但请记住它非常昂贵。
更新
如果最终解决方案不是那么明显,我深表歉意,这是使用历史数据计算每个成员(member)的提要的最终查询:
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
关于php - MySQL根据另一个表的时间戳选择信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074593/