2014-09-16 4 views
0

У меня есть список больниц (FacilityID_UUID), которые должны отправлять данные каждый день (дата = create_date).Кто не сообщил о дате? mysql нет в списке

В данный день я хотел бы установить, о чем не сообщалось в предыдущий день.

работы с этим:

SELECT `FacilityID_UUID` 
FROM `TEST` 
where `FacilityID_UUID` not in (
    SELECT distinct `FacilityID_UUID` 
    FROM `TEST` 
    where `Create_Date` = '2014-09-16' 
) 

(заменит даты с SYSDATE или интервал 1 день)

Однако, у меня есть две проблемы с этим:

1- это тааак медленно ! Бежал как 30 минут, и я не ожидаю более 20 результатов). Как я могу сделать это быстрее?

2- это только дает мне имена больниц, которые представили хотя бы один раз в прошлом, но не вчера. Если в среду начнет поступать больше больниц, я бы хотел, чтобы запрос в четверг подхватил это. В принципе, я хотел бы сказать: «Дайте мне больницы в списке X, который не был представлен вчера», и напишите сам список X.

Любые идеи

+0

что-то вроде левого внешнего соединения, вероятно, быстрее, чем in. Тогда просто найдите все результаты, когда какое-либо поле в левой таблице равно null. Также, начиная с вашей маленькой таблицы, вероятно, это хороший способ повысить скорость, –

+1

«ТЕСТ» * только * соответствующая таблица? (Это кажется странным, если это так и, вероятно, необходимо исправить.) Что такое * полное определение схемы и множественность FacilityID_UUID? Как «Дата создания» связана с «датой отправки»? – user2864740

ответ

0

Вы можете сделать LEFT JOIN, чтобы каждый тест, которые были сообщены или нет к этой дате, а затем сохранить только нулевые значения на второй таблицы, чтобы видеть только тесты, которые не были представлены на указанной даты.

SELECT FacilityID_UUID 
FROM TEST 
LEFT JOIN TEST AS REPORT_DATE_TEST ON TEST.FacilityID_UUID = REPORT_DATE_TEST.FacilityID_UUID 
AND REPORT_DATE_TEST.Create_Date = '2014-09-16 
WHERE REPORT_DATE_TEST.FacilityID_UUID IS NULL; 

Предыдущий запрос даст тот же результат, что и ваш запрос, но быстрее.

Но я подозреваю, что вы можете иметь только один ряд за UUID, в этом случае было бы

SELECT DISTINCT FacilityID_UUID 
FROM TEST 
LEFT JOIN TEST AS REPORT_DATE_TEST ON TEST.FacilityID_UUID = REPORT_DATE_TEST.FacilityID_UUID 
AND REPORT_DATE_TEST.Create_Date = '2014-09-16 
WHERE REPORT_DATE_TEST.FacilityID_UUID IS NULL; 
0

скорость запросов зависит от многих факторов, и вы будете в состоянии настроить это лучше чем кто-либо здесь. Давайте посмотрим на ваши данные и ваш запрос.

SELECT FacilityID_UUID FROM TEST where FacilityID_UUID not in 
     (SELECT distinct FacilityID_UUID FROM TEST where Create_Date = '2014-09-16') 

Этот запрос проверяет каждую строку TEST и возвращает те значения, которые не в списке объектов, которые имеют Create_Date из. Это определенно будет медленным. Для N элементов вы сравниваете некоторое подмножество N, которое, вероятно, довольно велико. Если TEST является большой таблицей (которая, если у нее новая запись каждый день для каждого объекта, она будет), тогда вы столкнетесь с проблемами скорости.

Лучше запрос:

Select FacilityID_UUID, max(Create_Date) from TEST where Create_Date < CURDATE() - 1 
       group by FacilityID_UUID order by FacilityID_UUID; 

Это должно быть близко к коррекции данных (возможно, придется Твик, где положение, я не делаю много работы с датами в MySQL).