2013-10-03 2 views
0

Этот запрос возвращает все выбранные значения от сегодняшнего дня до 90 дней назад:MySQL выберите последний х дней между диапазоном

SELECT max(cases_visits.created_dt), users_profiles.account_num, 
    concat(cases.patient_first_initial, 
    cases.patient_middle_initial, cases.patient_last_initial) AS initials, 
    concat(users.first_name, ' ',users.last_name) as name 
    FROM cases 
    JOIN users_profiles 
    ON users_profiles.user_id=cases.doctor_id 
    JOIN cases_visits 
    ON cases.id=cases_visits.case_id 

    join users on users.id = cases.doctor_id 

    WHERE cases_visits.patient_visit_type = 'NP' && cases_visits.created_dt BETWEEN  curdate() - INTERVAL 90 DAY AND SYSDATE() 

    group by users.first_name 

я хотел бы найти запрос, который теперь будет выбирать ту же самую вещь, но только если записи в предыдущем запросе не существуют. ПРИМЕР: возвращать записи с> 90 дней назад, у которых нет записей за последние 90 дней.

Я попытался сделать это: (примечание, 2013-07-03 в запросе было 90 дней с первого раза, я побежал)

SELECT cases_visits.created_dt, users_profiles.account_num, 
    concat(cases.patient_first_initial, 
    cases.patient_middle_initial, cases.patient_last_initial) AS initials, 
    concat(users.first_name, ' ',users.last_name) as name 
    FROM cases 
    JOIN users_profiles 
    ON users_profiles.user_id=cases.doctor_id 
    JOIN cases_visits 
    ON cases.id=cases_visits.case_id 
    join users on users.id = cases.doctor_id 
    WHERE cases_visits.created_dt < '2013-07-03' 
    group by users.first_name 

Это не дает мне правильные данные, я думаю, потому что мне нужно каким-то образом исключить записи, которые существуют за последние 90 дней.

ЭТО ЧТО ИМ ПЫТАЕТСЯ ДЕЛАТЬ: Выберите записи с aa = = 'NP' за последние 90 дней, тогда мне нужно выбрать записи, где нет значения np больше 90 дней, но эти записи должны быть полностью уникальными из первого запроса (то есть, у человека может быть дело в течение 90 дней, а 180 дней назад мне не нужны его записи.)

EDIT: Я забыл упомянуть, что пробовал этот запрос с ошибкой около «в»:

SELECT cases_visits.created_dt, users_profiles.account_num, 
concat(cases.patient_first_initial, 
cases.patient_middle_initial, cases.patient_last_initial) AS initials, 
concat(users.first_name, ' ',users.last_name) as name  
FROM cases 
JOIN users_profiles 
ON users_profiles.user_id=cases.doctor_id  
JOIN cases_visits 
ON cases.id=cases_visits.case_id  
join users on users.id = cases.doctor_id  
WHERE cases_visits.created_dt < '2013-07-03' 
and cases_visits.patient_visit_type = 'NP'  
and not in (select created_dt from cases_visits where cases_visits.patient_visit_type = 'NP' && cases_visits.created_dt BETWEEN curdate() - INTERVAL 90 DAY AND SYSDATE()) 
group by users.first_name 
+0

Ошибка в том, что у вас должно быть полевое имя между «и» и «не в» – AgRizzo

+0

Нет. Я поймал эту ошибку и все еще закончил с неправильным набором результатов :( – Kisaragi

ответ

0

Вы можете использовать подзапрос:

select * from table where ID NOT IN (select id from table where a=1); 

Это по существу выбирает записи из таблицы, которые не соответствуют записям, которые соответствует внутреннему запросу.

0
SELECT * FROM table WHERE cases_visits.created_dt < '2013-07-03' 
AND case_visist.SOME_UNIQUE_ID NOT IN 
(SELECT case_visist.SOME_UNIQUE_ID FROM table WHERE cases_visits.patient_visit_type = 'NP' && cases_visits.created_dt BETWEEN  curdate() - INTERVAL 90 DAY AND SYSDATE()) 

Вы можете использовать инструкцию NOT IN и ввести инструкцию SELECT, которая выбирает все записи, которые должны быть исключены. A a подробнее in this thread

+0

Это, похоже, не работает, я сомневаюсь, работает ли «2013-07-03», как я думаю. Я, кажется, проблема с использованием «не в» – Kisaragi

+0

Введенный вами последний вопрос вопроса забыл написать какой столбец для сравнения в NOT IN. Вы должны изменить «а не в« в »и« case_visits'.'created_dt' не в (... « – Jaroslav

+0

Забавно, что вы упомянули об этом, я только что понял, что LOL. Кажется, что сработал, но не проверял дубликаты. – Kisaragi

0

Этот набор должен быть визитом для того же врача, в тех же случаях, но с другим визитом?

SELECT max(cases_visits.created_dt), users_profiles.account_num, 
    concat(cases.patient_first_initial, 
    cases.patient_middle_initial, cases.patient_last_initial) AS initials, 
    concat(users.first_name, ' ',users.last_name) as name 
FROM cases 
JOIN users_profiles 
    ON users_profiles.user_id=cases.doctor_id 
JOIN cases_visits 
    ON cases.id=cases_visits.case_id 
JOIN users 
    ON users.id = cases.doctor_id 
WHERE cases_visits.patient_visit_type = 'NP' && cases_visits.created_dt <= curdate() - INTERVAL 90 DAY 
    AND EXISTS(SELECT * 
     FROM case_visits AS inside 
     WHERE inside.case_id = cases.id 
      AND inside.patient_visit_type = 'NP' 
      AND inside.created_dt BETWEEN curdate() - INTERVAL 90 DAY AND SYSDATE()) 
GROUP BY account_num, initials, name 
+0

Это возвращает нулевые результаты (я знаю, что это не тот случай, но я думаю, что вы положили меня на правильный путь! – Kisaragi

+0

Там была опечатка (исправлена ​​теперь из «case» в «case» в EXISTS (подзапрос) – AgRizzo

+0

Да, я это видел. Делает ли case_visits.created_dt <= curdate() - INTERVAL 90 DAY даю мне больше, чем 90 дней назад? – Kisaragi

Смежные вопросы