繁体   English   中英

MySQL根据另一个表的时间戳选择Info

[英]MySQL Selecting Info based on timestamp of another table

编辑:我已经把它放在PHP和MySQL类别中,因为我相信可能有一种方法可以使用多个查询来实现这一点,并使用PHP将它们联系在一起。 我宁愿不这样做......但在一天结束时,解决方案是一个解决方案......

希望有人能够轻松思考,但我肯定会被困在这里! 在我的网站上,我允许用户发布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,如上表所示。 任何人的想法?

注意#1 - 您要执行的查询非常昂贵,我的建议是在发布订阅源时将当前的membershipsid保存到供稿表中

注意#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

接下来是“如何列出所有Feed以及会员ID,其中X是发布Feed的时间?

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进行分组,但请记住它非常昂贵。

UPDATE

如果最终解决方案不那么明显,我很抱歉,这是使用历史数据计算每个成员资格的最终查询:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM