2013-05-31 2 views
1

То, что я пытаюсь выполнить, это вернуть инструкцию SELECT из всех дубликатов в таблице в заданных фильтрах.Заявление MySQL IN Hang

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

EDIT: Я добавил данные EXPLAIN в соответствии с запросами! EDIT 2: Я добавил инструкции CREATE в соответствии с запросами!

SELECT * 
FROM red_flags 
WHERE customer_number IN (SELECT customer_number 
          FROM red_flags 
          GROUP BY customer_number 
          HAVING COUNT(customer_number) > 1); 

План выполнения:

 
1 PRIMARY leads ALL     80708 Using where 
1 PRIMARY customers eq_ref PRIMARY PRIMARY 9 apcard_main.leads.customer_number 1 
2 DEPENDENT SUBQUERY leads ALL     80708 Using where; Using temporary; Using filesort 
2 DEPENDENT SUBQUERY customers eq_ref PRIMARY PRIMARY 9 apcard_main.leads.customer_number 1 Using index 

DDL:

Таблица customers:

CREATE TABLE `customers` (
    `customer_number` varchar(7) NOT NULL, 
    `dealer_id` varchar(32) DEFAULT NULL, 
    `first_name` varchar(64) DEFAULT NULL, 
    `middle_name` varchar(64) DEFAULT NULL, 
    `last_name` varchar(64) DEFAULT NULL, 
    `address_one` varchar(128) DEFAULT NULL, 
    `address_two` varchar(128) DEFAULT NULL, 
    `city` varchar(128) DEFAULT NULL, 
    `state` varchar(32) DEFAULT NULL, 
    `zip` char(5) DEFAULT NULL, 
    `fico` char(3) DEFAULT NULL, 
    `phone` varchar(13) DEFAULT NULL, 
    `mail_type` varchar(32) DEFAULT NULL, 
    `mail_date` date DEFAULT NULL, 
    `store` varchar(32) DEFAULT NULL, 
    PRIMARY KEY (`customer_number`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1$$ 

Таблица leads:

CREATE TABLE `leads` (
    `lead_id` int(11) NOT NULL AUTO_INCREMENT, 
    `dealer_id` varchar(32) DEFAULT NULL, 
    `customer_number` varchar(7) DEFAULT NULL, 
    `date` date DEFAULT NULL, 
    `time` time DEFAULT NULL, 
    `source` varchar(32) DEFAULT NULL, 
    `source_type` varchar(32) DEFAULT NULL, 
    `home_phone` varchar(13) DEFAULT NULL, 
    `email` varchar(64) DEFAULT NULL, 
    `mail_type` varchar(8) DEFAULT NULL, 
    `store` varchar(16) DEFAULT NULL, 
    `first_name` varchar(64) DEFAULT NULL, 
    `last_name` varchar(64) DEFAULT NULL, 
    `middle_name` varchar(32) DEFAULT NULL, 
    `city` varchar(128) DEFAULT NULL, 
    `state` varchar(32) DEFAULT NULL, 
    `zip` char(5) DEFAULT NULL, 
    `fico` char(3) DEFAULT NULL, 
    `mail_date` date DEFAULT NULL, 
    `work_phone` varchar(13) DEFAULT NULL, 
    `cell_phone` varchar(13) DEFAULT NULL, 
    `address_one` varchar(128) DEFAULT NULL, 
    `address_two` varchar(128) DEFAULT NULL, 
    `comment` varchar(255) DEFAULT NULL, 
    `caller_id` varchar(128) DEFAULT NULL, 
    PRIMARY KEY (`lead_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=125587 DEFAULT CHARSET=latin1$$ 

Просмотр red_flags:

CREATE 
    ALGORITHM=UNDEFINED 
    DEFINER=`apcard`@`97.83.30.118` 
    SQL SECURITY DEFINER 
VIEW `red_flags` AS 
select 
    `leads`.`dealer_id` AS `dealer_id`, 
    `customers`.`phone` AS `phone`, 
    `leads`.`date` AS `date`, 
    `leads`.`time` AS `time`, 
    `leads`.`source` AS `source`, 
    `leads`.`customer_number` AS `customer_number`, 
    `leads`.`caller_id` AS `caller_id`, 
    `leads`.`mail_type` AS `mail_type`, 
    `leads`.`store` AS `store`, 
    `leads`.`last_name` AS `last_name`, 
    `leads`.`first_name` AS `first_name`, 
    `leads`.`city` AS `city`, 
    `leads`.`state` AS `state`, 
    `leads`.`zip` AS `zip`, 
    `leads`.`fico` AS `fico`, 
    `leads`.`mail_date` AS `mail_date`, 
    `leads`.`home_phone` AS `home_phone`, 
    `leads`.`email` AS `email` 
from (`customers` join `leads`) 
where ((`customers`.`customer_number` = `leads`.`customer_number`) 
    and (`leads`.`date` >= (now() - interval 30 day)))$$ 
+2

'IN' может быть довольно медленным, но трудно сказать, в чем проблема, не видя, что делает запрос анализатора MySQL. Чтобы получить этот вывод, добавьте 'EXPLAIN' в запрос (' EXPLAIN SELECT ... ') и отредактируйте результат в свой вопрос; с выгодой от этой информации, это должно быть довольно просто найти проблему. –

+1

Попробуйте использовать 'EXISTS' – Kermit

+0

@FreshPrinceOfSO Exists не фильтровать результаты правильно 'SELECT * FROM red_flags WHERE EXISTS (SELECT Customer_Number FROM red_flags WHERE dealer_id = '75' GROUP BY CUSTOMER_NUMBER HAVING COUNT (CUSTOMER_NUMBER)> 1);' например, возвращает несколько дилерских идентификаторов в инструкции select вместо правильной фильтрации. – bmanhard

ответ

0

Вы пытались присоединиться, а не использовать подзапрос?

SELECT rf.* 
FROM red_flags rf 
inner join red_flags rf2 
on (rf2.customer_number = rf.customer_number) 
group by rf2.customer_number 
having count(rf2.customer_number) >1 
+0

Это работает, но он отображает только DISTINCT customer_number и не отображает ВСЕ дубликаты, как мне интересно. – bmanhard

0

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

leads.date >= now() - INTERVAL 30 DAY 
+1

Итак, что вы изменили? –

+0

Я только что удалил его и отказался от использования этого фильтра. – bmanhard

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