2015-01-23 2 views
0

Я совершенно бесполезен в отношении баз данных, но в настоящее время мне приходится работать с ним.Сравнение MySQL того же поля между двумя записями - запрос вечно

Мне нужно сделать запрос, который сравнивает значения даты между разными записями моей таблицы. У меня есть запрос вроде этого:

SELECT t1.serial_number, t1.fault_type, t2.fault_type 
FROM shipped_products t1 
     JOIN shipped_products t2 ON t1.serial_number=t2.serial_number 
WHERE ABS(DATEDIFF(t2.date_rcv,t1.date_rcv))<90; 

Но это навсегда для запуска. Действительно, я оставил его в течение 18 часов, и он никогда не останавливался. Правильно ли этот запрос? Есть ли лучший, более умный способ сделать это?

Большое спасибо, ребята.

BTW: Я буду автоматизировать весь процесс с помощью скриптов python, поэтому, если вы знаете, как лучше сделать это внутри python без всякой логики, находящейся внутри запроса, это также поможет.

EDIT: Мой вопрос кажется неясным, поэтому я лучше объясню, что мне нужно сделать. У меня есть проблема, что иногда продукты идут в центры ремонта и отправляются обратно клиентам, как «No Deffect found». После этого клиент отправляет его в ремонтные центры, поскольку они представляют ту же проблему. Поэтому мне нужен запрос, чтобы подсчитать, сколько продуктов было для ремонта центров дважды за 90 дней. Унифицированным идентификатором для каждого отдельного продукта является его серийный номер, и именно поэтому я ищу дубликаты номеров.

+1

только сколько записей у вас есть в таблицах? Ваш 'where' зависит от производных/вычисленных значений, поэтому невозможно использовать индексы для ускорения работы. –

+1

Можете ли вы описать, что вы хотите сделать? Примеры данных и желаемые результаты - большая помощь. –

+0

Любая часть обработки, которая может быть выполнена в хорошем SQL, должна быть выполнена там. Передача лишних строк, которые нужно обрабатывать в логике Python, намного менее эффективна. – msw

ответ

1

Каждая запись будет соответствовать самому себе (в t1 и t2) в этом объединении, так как DateDiff будет таким же и, следовательно, меньше 90. Убедитесь, что вы не согласны с одной и той же записью. Если у вас есть поле идентификатора в вашем столе, вы можете сделать это:

SELECT t1.serial_number, t1.fault_type, t2.fault_type 
FROM shipped_products t1 
     JOIN shipped_products t2 
     ON t1.serial_number=t2.serial_number 
     AND t1.ID <> t2.ID 
WHERE ABS(DATEDIFF(t2.date_rcv,t1.date_rcv))<90; 

Также убедитесь, что у вас есть ключ в serial_number.

0

Непонятно, почему вы хотите получить дубликаты в результатах. Если у вас есть две строки, удовлетворяющие условию, то оба будут в наборе результатов. Почему бы просто не взглянуть на записи, которые появятся позже? Если фраза запрос, как это:

SELECT t1.serial_number, t1.fault_type, t2.fault_type 
FROM shipped_products t1 JOIN 
     shipped_products t2 
    ON t1.serial_number = t2.serial_number 
WHERE t2.date_recv >= t1.date_rcv and 
     t2.date_recv < t1.date_recv + interval 90 day; 

Затем полученный запрос может воспользоваться индексом на shipped_products(serial_number, date_recv). Примечание: возможно, 90 должно быть 180.

Я подозрительно, когда вижу этот тип самостоятельного присоединения. Иногда его можно заменить запросом на агрегацию (иногда нет). Однако то, что вы на самом деле хотите сделать, неясно.

+0

Я думаю, что мне больше нравится мой ответ. Но я думаю, что первая часть вашего предложения WHERE должна быть>, not> =. В противном случае записи будут соответствовать самим себе. – Tom

+0

@Tom. , , Первоначальный код будет иметь совпадение записи. Я согласен с тем, что это может не иметь особого смысла, но OP все еще не объяснил, что он/она действительно хочет сделать для кода. –

+0

Привет, ребята, Спасибо за ваши ответы. Просто для того, чтобы все было ясно, у меня есть проблема в том, что иногда продукты идут в центры ремонта и отправляются обратно клиентам, как «No Deffect found». После этого клиент отправляет его в ремонтные центры, поскольку они представляют ту же проблему. Так что мне нужен запрос, чтобы подсчитать, сколько продуктов было для ремонта центров дважды за 90 дней. Унифицированным идентификатором для каждого отдельного продукта является его серийный номер, и именно поэтому я ищу дубликаты номеров. Спасибо, еще раз. –

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