簡體   English   中英

使用MySQL返回倒數第二個條目

[英]Returning the next-to-last entry using MySQL

一些信息:人們正在辦理登機手續,但他們沒有退房。 每次簽入都會在_checkins表中創建帶有時間戳,MemberID等的自動遞增的條目。

這是查詢需要返回的數據:

  1. 會員信息(姓名,圖片,ID等)
  2. 最近30天內的簽到次數
  3. 自從他們最后一次登機以來的時間必須少於2小時,這樣他們才能進入名單。
  4. 他們最近一次簽入的日期不是今天(換句話說,_checkins表中最后一個“已創建”條目的下一個)。

除了最后一部分,我都工作了。 我覺得LIMIT將成為解決方案的一部分,但我只是找不到正確實現它的方法。 到目前為止,這是我得到的:

SELECT m.ImageURI, m.ID, m.FirstName, m.LastName, 
ROUND(time_to_sec(timediff(NOW(), MAX(ci.Created))) / 3600, 1) as 
'HoursSinceCheckIn', CheckIns
FROM _checkins ci LEFT JOIN _members m ON ci.MemberID = m.ID
INNER JOIN(SELECT MemberID, COUNT(DISTINCT ID) as 'CheckIns'
                       FROM _checkins
          WHERE(
                       Created BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
                       )
          GROUP BY MemberID
          ) lci ON ci.MemberID=lci.MemberID

          WHERE( 
                       ci.Created BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
                       AND TIMESTAMPDIFF(HOUR, ci.Created, NOW()) < 2
                       AND ci.Reverted = 0
          )
          GROUP BY m.ID
    ORDER BY CheckIns ASC

您可以大大簡化(也可以使代碼更安全):

SELECT _Members.ImageURI, _Members.ID, _Members.FirstName, _Members.LastName, 
       ROUND(TIME_TO_SEC(TIMEDIFF(NOW(), _FilteredCheckins.lastCheckin)) / 3600, 1) AS hoursSinceCheckIn, _FilteredCheckins.checkIns,
       (SELECT MAX(_Checkins.created)
        FROM _Checkins
        WHERE _Checkins.memberId = _Members.ID
              AND _Checkins.created < _FilteredCheckins.lastCheckin) AS previousCheckin
FROM _Members
JOIN (SELECT memberId, COUNT(*) AS checkIns, MAX(created) AS lastCheckin
      FROM _Checkins
      WHERE created >= NOW() - INTERVAL 30 DAY
      GROUP BY memberId
      HAVING lastCheckin >= NOW() - INTERVAL 2 HOURS) _FilteredCheckins
  ON _FilteredCheckins.memberId = _Members.ID
ORDER BY _FilteredCheckins.checkIns ASC
  • 我們正在計算最近30天內的所有簽到位置,包括最近的簽到時間,但這是微不足道的。
  • 我假設_Checkins.id是唯一的(應該是),所以COUNT(DISTINCT ID)可以簡化為COUNT(*) 如果不是這種情況,則需要將其放回原處。

(旁注:請不要使用BETWEEN尤其是日期/時間類型

(幽默的旁注:我一直在腦子里把它讀作“雞”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM