2015-11-06 32 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