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

Вы, вероятно, попробуйте использовать имеющий пункт:

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

Вы не удаляете их. поэтому он называется soft delete.они все еще хранятся в вашем db, но им помечены для вас, чтобы вы знали, что есть новый код –

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 стоило точно добавить «i» в mysql ... – Bolovsky

0

Наверное, проще всего сделать LEFT OUTER JOIN лиц, не являющихся просроченными подписки для абонентов, а также проверить в ИНЕКЕ, что ни один не истек срок действия подписки найденный.

Сохраняет любые агрегатные функции.

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 
Смежные вопросы