2015-11-06 33 views
2

我有兩個數據庫表:MYSQL選擇所有過期的用戶

subscribers: (ID, name, email_address etc) 

而且 訂閱:(subsc_id,USER_ID,subsc_start,subsc_end)

我的問題是我怎麼能得到所有的結果已過期成員?我寫了一個SQL查詢:

SELECT * 
FROM subscriptions 
LEFT JOIN subscribers 
ON subscriptions.user_id = subscribers.ID 
WHERE DATE(subscription.subsc_end) < DATE(NOW()) 
GROUP BY subscriptions.user_id 

的問題是,如果一個用戶有一個活躍的認購,但也有較早到期的認購,那麼該用戶將也加入到過期列表。

誰能幫我寫正確的查詢?

謝謝

回答

1

你也許可以嘗試使用having子句:

SELECT * FROM subscriptions 
    LEFT JOIN subscribers 
    ON subscriptions.user_id = subscribers.ID 
GROUP BY subscriptions.user_id 
    HAVING MAX(DATE(subscriptions.subsc_end)) < DATE(NOW()) 
+0

謝謝!它正在工作! –

+0

不客氣:) – Bolovsky

2

所以你要找到用戶,其截止日期爲過去和他們的起始日期是前失效日期 - 那麼試試這個:

SELECT * FROM subscriptions 
LEFT JOIN subscribers 
ON subscriptions.user_id = subscribers.ID 
WHERE DATE(subscriptions.subsc_end) < DATE(NOW()) 
AND DATE(subscriptions.subsc_start) < DATE(subscriptions.subsc_end) 
GROUP BY subscriptions.user_id 
HAVING MAX(DATE(subscriptions.subsc_end)) < DATE(NOW()) 
+0

毫無疑問,它給了我和以前一樣的結果。 例如,我有一個擁有活動訂閱的訂閱者,並且他在數據庫中也有3個較早的過期訂閱記錄。 當我列出的活躍用戶,然後該用戶在此列表中,但是當我列出了所有過期的用戶,然後該用戶在過期列表了。 –

+0

每個用戶都有單行還是多行?如果不瞭解您如何處理用戶的數據,就很難發現問題的所在。 – Ben

+0

一個用戶可以在訂閱表中有多行 –

0

爲什麼不你在任何時候有人更新他的「軟刪除」舊訂閱? 一個「更新」字段添加到你的第二個表,只要有人更新自己的訂閱,把你戳他的舊的更新領域,這樣就可以在查詢中排除了嗎?

+0

比如有認購下一期的選擇,所以我們不能刪除舊的(活動)認購 而且我們必須存儲的個人訂閱交易過,所以我們可以檢查,如果事情是錯的交易 –

+0

你不會刪除它們。這就是爲什麼它被稱爲軟刪除。他們仍然存儲在你的分貝,但他們被標記爲你知道有一個新的 –

0

用PHP腳本執行此操作,這樣就可以顯示所有過期的用戶。

$get_exp = mysql_query("SELECT * FROM subscriptions LEFT JOIN subscribers ON subscriptions.user_id = subscribers.ID GROUP BY subscriptions.user_id") or die(mysql_error());; 

    while($row=mysql_fetch_assoc($get_exp)){ 
     $now = time(); 
     $end_date = strtotime($row['subsc_end']); 
     $exp_date = ($end_date - $now); 
     $totDays = floor($datediff/(60*60*24)); 
     if($totDays < 0){ 
      //display user, he/she expired 
     } 
    } 
+1

請不要使用mysql_ *擴展代碼。它完全不安全,不推薦使用,不支持很多功能,並且已經在PHP7中刪除。使用mysqli的費用正好給mysql添加一個「我」... – Bolovsky

0

大概是最容易做的一個LEFT OUTER JOIN非過期的訂閱用戶,並在WHERE子句中沒有非過期的訂閱是在檢查找到。

保存任何聚合函數。

SELECT * 
FROM subscribers 
LEFT JOIN subscriptions 
ON subscriptions.user_id = subscribers.ID 
AND DATE(subscription.subsc_end) > DATE(NOW()) 
WHERE subscriptions.subsc_id IS NULL