2013-07-10 182 views
3

我正在嘗試構建一個查詢,該查詢將列出具有最近90年內條目的表中的所有用戶ID天,但不在最近30天內。SQL查詢查找在過去30天內沒有記錄但在過去90天內有記錄的用戶

表的超簡化版本將有三個字段:RecordID(主鍵,自動遞增),UserID(外鍵)和RecordDate(時間戳)。

我知道如何在兩個查詢中做到這一點,但可以在一個查詢中完成嗎?它應該返回任何用戶的用戶名,但用戶的入口少於90天,但在過去30天內沒有條目。

回答

0
select distinct(userid) 
    from thetable 
where recorddate > DATE_SUB(now(), INTERVAL 90 DAY) 
    and userid not in 
     (
     select userid 
      from thetable 
     where recorddate > DATE_SUB(now(), INTERVAL 30 DAY) 
    ) 

我不知道MySQL的好,所以用適當的方式進行檢查,如果日期是在過去x天

我假設一個用戶ID可以在表中多次,但你只希望他們返回一次。因此,「獨特」

+1

這接近,但不應該「和的recordId不「be」和userid不在「? –

+1

我修正了語法和IN子句... – Curt

0

下面的查詢應該做的工作:

SELECT UserID 
FROM MyTable AS T1 
WHERE 
    (SELECT MIN(DATEDIFF(NOW(),RecordDate)) 
    FROM MyTable AS T2       -- Most recent entry must be more 
    WHERE T2.UserID=T1.UserId) BETWEEN 31 AND 90 -- than 30 days ago, but no more 
               -- than 90 days ago 
+0

我不認爲這個帳戶是「在過去30天內沒有發送任何記錄」,它只發現已經發送過去30-90個用戶 –

+0

@Ben,I修改了查詢以將其餘條件考慮在內。我現在沒有訪問MySQL的權限,但是請稍等片刻。 –

0

這應該這樣做

SELECT DISTINCT UserID 
FROM Table t1  
WHERE RecordDate > DATE_SUB(NOW(), INTERVAL 90 DAY) 
AND NOT EXISTS (
    SELECT 1 FROM Table 
    WHERE RecordDate > DATE_SUB(NOW(), INTERVAL 30 DAY) 
    AND UserID = t1.UserID 
) 
0
SELECT UserID 
FROM 
(
    SELECT UserID, 
      MIN(RecordDate) AS min_date, 
      MAX(RecordDate) AS max_date 
    FROM MyTable 
      GROUP BY UserID 
) 
WHERE max_date < AddDate(CURRENT_TIMESTAMP, INTERVAL -30 DAY) 
    AND min_date >= AddDate(CURRENT_TIMESTAMP, INTERVAL -90 DAY) 
相關問題