2014-07-09 203 views
1

我想结合两个查询。加入两个MySQL查询

第一个给我在特定月份的所有注册。

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

第二个查询已经登录在一月,二月和三月

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的用户不使用IN?

感谢

+1

如果你喜欢,可以考虑下列行为这个简单的两步过程:1。如果你不这样做的话,提供适当的DDL(和/或sqlfiddle)这样我们可以更容易地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

回答

2

你可以用你的2个查询UNION ALLgroup by player_idhaving count(*) > 1

,或者使用内部连接(我想补充一个不同的连接查询)

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

你可以使用子查询和联接来完成此操作。查询的第一部分从玩家返回玩家ID。第二部分将您的login_history子集仅限于您想要的id,即用户在Jan和March之间登录的id。此表加盟的球员,让你只在谁登记一月及一月,二月,三月和

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期间登录的将是很好的用户标识。

但您是否尝试加入这两个表,然后分组数据?

事情是这样的:

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