SQL-запрос для получения данных из большого списка строк - PullRequest
1 голос
/ 21 июля 2010

У меня большой список строк ( 1500 адресов электронной почты, чтобы быть более точным ), и мне нужно найти фрагмент данных в очень большой таблице БД для каждой из строк (например, первичный ключ, mydataitem).Как я могу сделать это эффективно?


Например, это слишком медленно ( среди других проблем ):

$stringArray = ('foo','bar','baz',..., 'for 1000s of items');

foreach($stringArray as $mystring) {
    $res = mysql_query("select mydataitem,blah FROM users WHERE blah = '$mystring'");
    $info=mysql_fetch_assoc($res);
    ...
}

Вещи Iхочу избежать:

  • Я не хочу перебирать список и делать SELECT для каждого элемента.то есть 1500 запросов (, как в примере выше )
  • Я не хочу читать всю таблицу в массив за один запрос и выполнять поиск в коде, потому что это заняло бы слишком много памяти,Таблица БД содержит более 100 тыс. Строк.
  • Я не хочу создавать массивный запрос с 1499 операционными операциями, потому что запрос будет слишком большим.(например, "select mydataitem FROM users WHERE blah = 'aaa' OR blah = 'bbb' OR ...")

Примечание: я использую MySql v5.0.45


Обновление: Спасибо всем - почему-то я думал, что IN был только для списков целочисленных идентификаторов - теперь я знаю лучше.

Ответы [ 5 ]

2 голосов
/ 21 июля 2010
mysql_query("select mydataitem,blah FROM users WHERE blah IN ('"
    .implode("','",array_map('mysql_real_escape_string',$stringArray)."')';

Еще лучше, используйте mysqli или PDO, которые могут использовать подготовленные операторы:

$stmt = $PDO->prepare('select mydataitem,blah FROM users WHERE blah IN ('
  .implode(',',array_fill(0,count($stringArray),'?')).')';
$stmt->execute($stringArray);
1 голос
/ 21 июля 2010

Если это не требуется, но молниеносно, я бы просто использовал MySQL в пункте

, чтобы превратить массив в строку:

$emails = array("abc@def.com", "123@456.net", "me@google.com");

$list = "(\"". implode("\", \"", $balls) . "\")";

, а затем просто использовать его в вашем sql

$sql = "select mydataitem FROM users WHERE blah in {$list}";
1 голос
/ 21 июля 2010

Я думаю, что вы хотите

SELECT mydataitem FROM users WHERE blah IN ('foo', 'bar', 'baz', ...)
1 голос
/ 21 июля 2010

Если вы используете подготовленный оператор, вы можете подготовить его вне цикла, а затем использовать его внутри цикла.Это должно выполняться быстрее, чем новый вызов mysql_query каждый раз.

Я не знаю, что вы подразумеваете под запросом "слишком большой".Попробуйте и посмотрите, как медленно.

Добавьте ключ в поле электронной почты, если у вас его еще нет.

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

1 голос
/ 21 июля 2010
WHERE blah IN ('aaa','bbb',...)

Но это все еще не эффективно.

Если вы объясните, почему вам нужно извлечь так много записей, возможно, мы сможем придумать более эффективную логику.

EDIT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...