확인 - promise-mysql await




x 연속 일 확인-데이터베이스에 지정된 시간 소인 (3)

SQL만으로도 해결할 수있는 어려운 문제입니다.

문제의 핵심은 하나의 쿼리에서 동적 결과 집합을 서로 비교해야한다는 것입니다. 예를 들어 하나의 DATE에 대해 모든 로그인 / 세션 ID를 가져온 다음 DATE () (DATE_ADD를 사용하여 확인할 수 있음)의 로그인 그룹에 목록으로 JOIN 또는 UNION을 입력해야합니다. N 개의 연속 된 날짜에 대해이 작업을 수행 할 수 있습니다. 남아있는 행이 있으면 해당 세션이 해당 기간 동안 로그인되었습니다.

다음 표를 가정합니다.

sessionid int, 만든 날짜

이 쿼리는 최근 2 일 동안 행이있는 모든 세션 ID를 반환합니다.

select t1.sessionid from logins t1 
  join logins t2 on t1.sessionid=t2.sessionid 
  where t1.created = DATE(date_sub(now(), interval 2 day)) 
    AND t2.created = DATE(date_sub(now(), interval 1 day));

보시다시피, SQL은 30 일 동안 삐걱 거리게됩니다. 스크립트로 생성하십시오. :-디

또한 매일 로그인 테이블이 세션으로 업데이트된다고 가정합니다.

이것이 실제로 문제를 해결할 지 모르겠지만 문제의 골격을 도왔을 때가 되었기를 바랍니다.

행운을 빕니다.

혹시 로그인 (사용자 ID, 타임 스탬프)이 저장되는 데이터베이스 테이블 (MySQL)에서 X 연속 일을 확인할 수있는 아이디어 나 힌트를 누군가에게 줄 수 있습니까?

Stackoverflow가 수행합니다 (예 : 매니아와 같은 배지 - 30 일 연속으로 로그인하는 경우 ...). 어떤 기능을 사용해야합니까, 아니면 어떻게 할 생각입니까?

뭔가 SELECT 1 FROM login_dates WHERE ... 와 같은 SELECT 1 FROM login_dates WHERE ... ?


login_dates 테이블에 default_days가 1이라는 추가 열을 추가하는 것이 더 간단하지 않을까요? 이것은 그 날로 끝나는 연속 날짜의 길이를 나타냅니다.

Login_dates에서 트리거 후 삽입을 작성하여 전날의 항목이 있는지 확인하십시오.

아무 것도 없으면, 그 필드는 그 날짜에 새로운 시퀀스가 ​​시작된다는 것을 의미하는 디폴트 값 1을 가질 것이다.

여기에 전날의 항목이 있으면 days_logged_in 값을 기본값 1에서 이전 날짜의 1보다 크게 변경하십시오.

전의:

| date       | consecutive_days |
|------------|------------------|
| 2013-11-13 | 5                |
| 2013-11-14 | 6                |
| 2013-11-16 | 1                |
| 2013-11-17 | 2                |
| 2013-11-18 | 3                |

이 날짜 범위의 별개 (날짜)가 == X 일 경우 시간 소인 날짜에 X를 추가하고 chech 할 수 있습니다.

30 일 중 매일 적어도 한 번 :

SELECT distinct 1 
FROM 
   login_dates l1 
inner join
   login_dates l2
      on l1.user = l2.user and 
         l2.timestamp between l1.timestamp and  
                              date_add( l1.timestamp, Interval X day )
where l1.user = some_user
group by 
   DATE(l1.timestamp)
having 
   count( distinct DATE(l1.timestamp) ) = X

(당신은 성능 요구 사항에 대해 연설하지 않습니다 ...;))

* 편집 됨 * 마지막 X 일만 쿼리 : 동쪽 일 30 일

SELECT distinct 1 
FROM 
   login_dates l1 
where l1.user = some_user
      and l1.timestamp >  date_add( CURDATE() , Interval -X day )
group by
    l1.user
having 
   count( distinct DATE(l1.timestamp) ) = X






gaps-and-islands