То, что я пытаюсь выполнить, это вернуть инструкцию 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)))$$
'IN' может быть довольно медленным, но трудно сказать, в чем проблема, не видя, что делает запрос анализатора MySQL. Чтобы получить этот вывод, добавьте 'EXPLAIN' в запрос (' EXPLAIN SELECT ... ') и отредактируйте результат в свой вопрос; с выгодой от этой информации, это должно быть довольно просто найти проблему. –
Попробуйте использовать 'EXISTS' – Kermit
@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