2017-01-27 19 views
0

我正在處理舊的mysql數據庫(不是由我創建的)。它有30萬個用戶,用戶標記爲標誌= 0,標誌= 1或標誌= 1,標誌= 0。後者意味着用戶在過去被標記並且不再被標記。該表是這樣的:Mysql:3種類型的用戶,具有多個條目的行,不能單獨

user_id | log_data | action | data | 
001  | 1-1-2002 | flip-flag | flag=0 | 
002  | 2-2-2003 | flip-flag | flag=1 | 
002  | 2-3-2003 | flip-flag | flag=0 | 
003  | 3-3-2003 | flip-flag | flag=1 | 

我試圖創建一個僅包含被標記在過去的這一點,不再標記(標記= 1個標誌= 0,USER_ID = 002上表中的用戶列表)我試過了:

select user_id, data 
from table_name 
where (data = 'flag=1' and data = 'flag=0') 
limit 50; 

但它不返回任何結果。這樣做的:

select user_id, data 
from table_name 
where data = 'flag=1' limit 50; 

給所有用戶提供標誌標記列表= 1(當前標記和標記過去)。有人知道在這種情況下該怎麼辦?

回答

1

嗯。 。 。我想聚集和having

select user_id 
from table_name 
group by user_id 
having max(case when data = 'flag=1' then log_date end) < 
     max(case when data = 'flag=0' then log_date end); 
0

只是要清楚,你寫永遠不會返回任何數據下面的查詢 - 在同一行不能有數據=「標誌= 1」和數據='標誌= 0',這就是爲什麼你必須使用聚合或自我連接來獲得這個權利。

select user_id, data 
from table_name 
where (data = 'flag=1' and data = 'flag=0') 
limit 50; 

另一種解決方案(除了戈登的版本可能不太有效)

select t0.user_id   
from table_name t0 
where (select t1.logdate from table_name t1 where t1.user_id = t0.user_id 
     and data = 'flag=1' order by 1 desc limit 1) > 
     (select t2.logdate from table_name t2 where t2.user_id = t0.user_id 
     and data = 'flag=0' order by 1 desc limit 1) 
group by t0.table_name 
相關問題