Большой оператор IN - данные из электронной таблицы - PullRequest
2 голосов
/ 10 января 2011

У меня есть такая таблица:

People
-----------------
email_address
created_date

У меня также есть электронная таблица, содержащая около 60 000 адресов электронной почты.Мне нужно выбрать «create_date» для каждого адреса электронной почты в электронной таблице.В настоящее время я подхожу к этому, создав один большой оператор select с предложением IN:

SELECT email_address, created_date FROM People WHERE email_address in (
'user1@something.com',
'user2@something.com',
'user3@something.com',
...

Проблема в том, что это ОГРОМНЫЙ скрипт (более 60 000 строк), и я не могу дажезаставить его работать из-за ошибок типа "Получил пакет больше, чем 'max_allowed_packet' bytes" и "MSQL Server удалился".

Я мог бы исправить эти ошибки, увеличив max_allowed_packet и т. д., ноУ меня такое ощущение, что это может быть просто симптомом того, что мой SQL не работает, и вместо того, чтобы просто лечить его, я должен решить проблему и написать более качественный SQL.Дайте мне знать, если у вас есть предложения!

Ответы [ 2 ]

5 голосов
/ 10 января 2011

Загрузить адреса электронной почты в отдельную таблицу с одним столбцом и использовать

 SELECT email_address, created_date FROM People 
    WHERE email_address IN (SELECT email_address FROM email_table)
1 голос
/ 10 января 2011

Сначала создайте таблицу адресов, включая индекс

CREATE TABLE Addresses (addr char(255) primary key);

Вставьте адреса в скрипт

INSERT INTO Addresses VALUES ('address1'),('address2'),...;

При необходимости можно разбить вставку (большой скрипт)

INSERT INTO Addresses VALUES ('address1'),('address2');
INSERT INTO Addresses VALUES ('address3'),('address4');
...

Тогда вы можете легко и быстро выполнить поиск в таблице People

SELECT p.email_address, p.created_date 
FROM People as p JOIN Addresses as a ON p.email_address=a.addr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...