2017-10-27 12 views
0

少しの情報:人はチェックインしますが、チェックアウトしません。 、MySQLを使用して次の最後のエントリを返す

  1. メンバーの情報(名前、写真、ID:各チェックインなど、タイムスタンプ、MEMBERID、ここでクエリが返すために必要なデータです

    と_checkinsテーブルにオートインクリメントエントリを作成します

  2. 過去30日間のチェックイン回数
  3. 最後にチェックインしてからの時間は、 がリストに登録されている場合は2時間未満でなければなりません。
  4. 最後にチェックインされた日付(今日は 、最後に_checkinsテーブルの "Created"エントリの次のもの)です。

最後の部分を除いてすべて機能しています。私は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 
+1

....最後チェックインは今日または次の最後のエントリにカウントされませんか?これらは必ずしも同じものではありません。あなたが「最後のチェックインは2時間以上前です」 –

+1

真。彼らは1日に1回以上チェックインできるので、最後に私が探しているエントリーの次のものになるでしょう。一般的な考え方は、定期的にジムに出席していないメンバーにスタッフが手を差し伸べることができるように顧客保持ツールを構築することです。つまり、1日に1回以上チェックインするメンバーはリストに載っていない可能性がありますが、それは可能です。 – digiteeb

答えて

0

あなたは(だけでなく、あなたのコードがより安全に)大幅に簡素化することができます:

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(*)に簡略化することができます。そうでない場合は、それを元に戻す必要があります。

(サイドノート:BETWEENespecially with date/time typesを使用しないでください)

(ユーモラスなサイドノート:私は.... "鶏" としてこれを読んで精神的に保つ)

関連する問題