2017-01-27 2 views
0

私は古いmysqlデータベース(私によって作成されていない)で作業しています。それには300kユーザーがおり、フラグ= 0、フラグ= 1、フラグ= 1、フラグ= 0のいずれかのフラグが付けられます。後者は、ユーザーが過去にフラグが立てられ、現在はフラグが立てられていないことを意味します。私は過去にフラグが付けられませんでしたし、もはや上記の表に(フラグ= 1つの、フラグ= 0、USER_ID = 002フラグが立てられているユーザーのみを含むリストを作成しようとしています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 | 

:のように表には見えます)私は試しました:

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

しかし、結果は返されません。 Doing:

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

は、フラグ= 1(現在のフラグが立てられ、過去のフラグが立てられている)でフラグが立てられたすべてのユーザーのリストを返します。誰もこの場合に何をすべきか知っていますか?

答えて

1

Hmmm。 。 。 =同じ行には「= 1のフラグ」データ=を持つことができないと、データ= 'フラグ - ただ、明確にする

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

、あなたが書いた次のクエリは、任意のデータを返すことはありません:私は、集約とhavingを考えています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 
関連する問題