2人のユーザーのステータスイベントを含む次のような単純なテーブルを想定します。 status_idが1の場合、それらは「アクティブ」になり、それ以外の場合は非アクティブになります。 がとなったユーザーが、たとえば2015-05-01(その日付は含まれません)の1年以内に無効になったことを確認する必要があります。私は結果を得ることができますクエリMySQL:特定の日付の前に最新の日付でレコードを選択する方法
SELECT t1.*
FROM user_status t1
WHERE t1.date_assigned = (SELECT MIN(t2.date_assigned) -- the first occurrence
FROM user_status t2
WHERE t2.user_id = t1.user_id -- for this user
AND t2.status_id <> 1 -- where status not active
AND t2.date_assigned BETWEEN -- within 1 yr of given date
'2015-05-01' + INTERVAL 1 DAY -- (not including that date)
AND
'2015-05-01' + INTERVAL 1 YEAR
)
を使用して
CREATE TABLE user_status(
user_id INT,
status_id INT,
date_assigned VARCHAR(10));
INSERT INTO user_status(user_id, status_id, date_assigned)
VALUES
(1234, 1, '2015-01-01'), -- 1234 becomes active (status id = 1)
(1234, 2, '2015-07-01'), -- 1234 de-activated for reason 2
(5678, 1, '2015-02-01'), -- 5678 becomes active (status id = 1)
(5678, 3, '2015-04-01'), -- 5678 de-activated for reason 3
(5678, 5, '2015-06-01'); -- 5678 de-activated for reason 5
user_id status_id date_assigned
1234 2 2015-07-01
5678 5 2015-06-01
これは一種の権利であるが、ユーザ5678が存在してはならないので、彼らは内非アクティブなイベントがあったものの、希望の日付範囲が開始される前に既に無効になっていたため、はその範囲内で無効になるになりませんでした。
「アクティブなイベントがあるユーザを表示する」とそのユーザの前のstatus_idが1だった、つまり非アクティブなときにアクティブだったユーザのみを表示する必要がありますイベントが発生しました。
誰でも私に正しい構文を教えてもらえますか?
あなたはあなたのクエリにNOT EXISTS
を追加することができますSQL fiddle
申し訳ありませんが、それは動作しません。別のレコード(5678、1、 '2015-04-20')を追加すると、5678が日付範囲の直前(以前は非アクティブになった後)に再度アクティブになるので、aのために非アクティブとしてピックアップされません2回目の2015年6月1日 – user3209752
ああ、正しく動作するようです、ありがとうございます。私はあなたの答えを編集で受け入れました。 – user3209752