2017-08-23 91 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'。 –