2015-02-06 3 views
1

У меня есть база данных mySQL. Одна из таблиц - это история членства и записи каждый раз, когда член обновляется. Существует уникальное поле автоматического инкремента, одно для имени пользователя для члена (которое является константой для каждого члена), а другое - для даты истечения срока действия.Найти две записи в таблице базы данных с разными критериями

Я ищу способ поиска всех членов, которые, к примеру, истекли в ноябре 2014 года, а затем обновлены в январе 2015 года (их новая дата истечения срока действия - январь 2016 года). Данные для каждого из них будут в двух отдельных строках таблицы.

Итак, я ищу, чтобы найти имя_пользователя, где expiry = Nov 14, а также найти то же имя для входа, если есть еще одна запись expiry = Jan 16, а затем отобразить результат в виде списка.

Я работаю в этом направлении, но я еще не там ...

SELECT * FROM `membership_history` 
WHERE `login_name` IN (
    SELECT `login_name` 
    FROM `membership_history` 
    WHERE `membership_enddate` BETWEEN '2014-11-01' AND '2014-11-30' 
    OR `membership_enddate` BETWEEN '2016-01-01' AND '2016-01-31' 
    GROUP BY `login_name` HAVING count(`login_name`) > 1 
) 
ORDER BY `login_name` 

Любые советы и помощь будут оценены - спасибо

ответ

0

Во-первых, я был бы склонен напишите это как join, а не in. Затем вы можете исключить пункт where, если это не требуется по соображениям производительности (он фильтрует данные, но не требуется для получения тех же результатов):

SELECT mh.* 
FROM `membership_history` mh JOIN 
    (select login_name 
     from membership_history mh2 
     group by login_name 
     having sum(membership_enddate BETWEEN '2014-11-01' AND '2014-11-30') > 0 and 
      sum(membership_enddate BETWEEN '2016-01-01' AND '2016-01-31') > 0 
    ) ml 
    on mh.login_name = ml.login_name; 
Смежные вопросы