根据最近24小时获取行共享mysql

时间:2017-08-23 11:18:57

标签: java mysql sql database database-design

我正在开发某种社交消息发布应用程序。在那里,我需要获取过去24小时的数据趋势数据。我有3个表 - 消息,用户,共享

message - message_id,contents,user_id,created_at

用户 - user_id,电子邮件和其他数据

shares - message_id,user_id,created_at

现在,我想要获取的是消息详细信息及其共享总数。我想根据过去24小时内的最高份额对这些消息进行排序,这给了我病毒式消息。

我试过,可能是无效的尝试:

SELECT msg.`message_id`, msg.`user_id`, COUNT(share.user_id) share_count
msg.created_at, category FROM 
(select * from message_shares ms where created_at>= DATE_SUB(CURDATE(), INTERVAL 24 HOUR)) trending,
 `messages` msg
left join message_shares share ON share.message_id = msg.message_id 
GROUP by msg.message_id order by msg.id desc

它给了我无效的share_count,也没有给出有效的结果和消息。并且根据最近24小时的共享计数,它没有对消息进行排序。

我不具备MySQL查询的高级知识。所以请提供方法或查询以查找这些详细信息。

2 个答案:

答案 0 :(得分:1)

也许你正在寻找这样的东西:

SELECT messages.message_id, messages.user_id, messages.created_at, 
COUNT(*) AS share_count 
FROM messages
INNER JOIN shares ON messages.message_id = shares.message_id
WHERE shares.created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY shares.message_id
ORDER BY share_count DESC;

直观的解释是,首先,选择messagesshare中的行相关联的行,并使用created_at share的条件进行过滤。 - 小时间隔。作为连接的结果,存在与此消息具有的共享数量相同的消息的行数。然后,您可以message_id share进行分组,因此每封邮件都有一个“其共享组”,您可以通过添加COUNT(*)列来获取每个组的大小,该列现在有效分组方式。然后按share_count对行进行排序,并使用您需要的字段获取查询的投影。

答案 1 :(得分:0)

这个表述应该避免“加入...分组”造成的“膨胀 - 收缩”性能损失:

SELECT  messages.message_id, messages.user_id, messages.created_at,
    (
        SELECT  COUNT(*)
            FROM  shares  ON messages.message_id = message_id
            WHERE  created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR) 
    ) AS share_count
    FROM  messages
    ORDER BY  share_count DESC;

另外,请shares

INDEX(message_id, created_at)

如果您需要进一步讨论,请提供SHOW CREATE TABLE表格。