2017-08-23 57 views
0

我正在处理某种社交消息发布应用程序。在这一点上,我需要获取过去24小时内的数据趋势数据。我有3个表 - 信息,用户,共享根据最近24小时的股票获取行mysql

消息 - MESSAGE_ID,内容,USER_ID,created_at

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

股 - 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查询没有太多先进的知识。所以请给我提供方法或查询来找到这些细节。

回答

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; 

直观的解释是,首先,从messages选择行与share行,当中sharecreated_at不到条件过滤加盟24小时的时间间隔。作为连接的结果,具有与该消息具有的份数相同的消息的行数是多少。然后,您可以按message_idshare进行分组,因此每封邮件都有一个“其份额组”,您可以通过添加COUNT(*)列来获得每个组的大小,该列现在可以按组进行分组。然后按share_count对行进行排序,并使用所需的字段获取查询的投影。

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有关表格。

+0

这不起作用。它为每一行返回相同的'share_count'。 –