2014-07-09 2 views
1

두 개의 쿼리를 결합하려고합니다.두 개의 MySQL 쿼리에 합류

첫 번째는 특정 달에 모든 등록을 제공합니다.

SELECT player_id from player where registration_datetime like '%2013-12%'; 

두 번째 쿼리는 IN을 사용하지 않고

SELECT player_id 
         FROM login_history 
         GROUP BY player_id 
         HAVING SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1)) > 0 and 
           SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1)) > 0 and 
           SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-03-01 00:00:00') AND (UNIX_TIMESTAMP('2014-04-01 00:00:00')-1)) > 0 
         ; 

가 어떻게 두 개의 쿼리 사이의 일반적인 player_id의의를 찾을 수 있습니다 월 2 월 3 월

에 로그인 한 사용자를 발견?

감사

+1

, 액션이 2 단계의 간단한 과정 다음 사항을 고려 : 아직 수행하지 한 경우 1. 적절한 DDLs를 제공 (및/또는 sqlfiddle) 문제를보다 쉽게 ​​복제 할 수 있습니다. 2. 아직 수행하지 않았다면 1 단계에서 제공된 정보와 일치하는 원하는 결과 세트를 제공하십시오. – Strawberry

답변

2

당신이 (내가 조인 된 쿼리에 뚜렷한를 추가)

SELECT player_id 
FROM login_history 
join (SELECT distinct player_id from player where registration_datetime like '%2013-12%') s 
    on s.player_id = player_id     
GROUP BY player_id 
HAVING SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1)) > 0 and 
     SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1)) > 0 and 
     SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-03-01 00:00:00') AND (UNIX_TIMESTAMP('2014-04-01 00:00:00')-1)) > 0 
0

당신을 당신이 개 쿼리에 UNION ALL, group by player_idhaving count(*) > 1

를 사용하거나 내부 조인 사용할 수 있습니다 이 작업을 수행하기 위해 하위 쿼리와 조인을 사용할 수 있습니다. 쿼리의 첫 번째 부분은 플레이어 ID를 반환합니다. 두 번째 부분은 login_history를 원하는 id, 사용자가 1 월과 3 월 사이에 로그인 한 ID로만 나눕니다. 이 테이블은 당신에게 월에 등록하고 좋은 것 월, 2 월과 월

SELECT a.player_id 
FROM player AS a 
INNER JOIN (
SELECT player_id 
FROM login_history 
GROUP BY player_id 
HAVING SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1)) > 0 AND 
SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1)) > 0 AND 
SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-03-01 00:00:00') AND (UNIX_TIMESTAMP('2014-04-01 00:00:00')-1)) > 0) AS b 
ON a.player_id = b.player_id 
WHERE a.registration_datetime like '%2013-12%' 
1

sqlfiddle 동안 로그인 한 사용자의 ID를 제공, 플레이어와 결합된다.

하지만 두 테이블을 결합한 다음 데이터를 그룹화 해 보았습니까? 이 같은

뭔가 : 원하는 경우

SELECT p.player_id FROM player p 
JOIN login_history lh ON p.player_id = lh.player_id 
WHERE p.registration_datetime like '%2013-12%' 
GROUP BY p.player_id 
HAVING SUM(lh.timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1)) > 0 and 
     SUM(lh.timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1)) > 0 and 
     SUM(lh.timestamp BETWEEN UNIX_TIMESTAMP('2014-03-01 00:00:00') AND (UNIX_TIMESTAMP('2014-04-01 00:00:00')-1)) > 0; 
+0

감사합니다. 또한 점검 기간을 변경하기가 쉬워졌습니다 ... 감사합니다. – Staggan

관련 문제