Помогите с запросом

demon_mhm

Новичок
Помогите с запросом

Задача: есть таблица, в которой лежат код оператора мобильной связи, первые три цифры номера телефона и, скажем, название оператора. На входе имеем цельный номер телефона.
Может я сильно туплю, но чето не могу допереть как запрос составить чтоб по целому номеру выбрать имя оператора.
PHP:
SELECT op_name 
FROM regions_operators r
WHERE concat(r.op_code,r.prefix)
LIKE что???
или как вообще?
 

tf

крылья рулят
веселый вопросик, кажется тебе надо просто отдохнуть
PHP:
что положил в базу, по тому и выбираеш (в данном случае r.prefix), только сначало выдели его из пролного номера телефона 
SELECT op_name 
FROM regions_operators r 
WHERE r.prefix='234'
 

demon_mhm

Новичок
Хех, если б все было так просто...
Я НЕ знаю префикса, НЕ знаю сколько в нем цифр (хотя в большинстве префиксов) и про первые три цифры номера я тож наврал, их может быть и 4 и 5... Тоесть я не могу выделить ничего из номера, мне нужно просто склеить код оператора и первые цифры его номеров и найти совпадения во входном номере. Если бы это был чистый ПХП, то тут все просто, регулярные выражения рулят полюбому, а вот в мускуле затык вышел... Вот тут накропал во такой вариант:
PHP:
SELECT  op_name
FROM regions_operators r
WHERE  concat(r.op_code,r.prefix) = 
left('$phone_num',LENGTH(concat(r.op_code,r.prefix)))
но отрабатывает секунды две и посему не вариант...
Или я все еще чего-то не понимаю?...
 

tf

крылья рулят
И зачем люди сами себе придумывают лишние проблемы
и про первые три цифры номера я тож наврал, их может быть и 4 и 5... .
вот это ты зря
Тоесть я не могу выделить ничего из номера, мне нужно просто склеить код оператора и первые цифры его номеров и найти совпадения во входном номере. Если бы это был чистый ПХП, то тут все просто, регулярные выражения рулят полюбому, а вот в мускуле затык вышел...
какая разница данные есть данные, о чем я и говорил ' только сначало выдели его из пролного номера телефона'
что тебе мешает темиже рег выраж выделить в пхп это префикс и сравнить с базой
ps. приведи хоть часть своих номеров - неужели они и вправду такие злые
 

demon_mhm

Новичок
Чтобы воспользоваться ПХП в данной ситуации мне нужно всосать в память таблицу из 10 тыс записей и делать с ней все, чту душе угодно :)
А про номера, не такие уж они, конечно и злые, просто хочется универсального, изящного подхода.
Первые три цифры, положим, у всех номеров - это признак оператора, а вот дальше труднее, в некоторых регионах попадаются четырех-пятизначные начальные цифры для номеров и какое тут регулярное выражение, когда я не знаю, откуда этот номер и какие у него цифры что значат? :)
 

antson

Новичок
Партнер клуба
demon_mhm
добавь в where проверку перед
своим условием
r.op_code = 'трицифрыизномера' and
неподходящие записи будут давиться а сложная проверка
пойдет только для записей конкретного оператора.

насколько быстрее станет напиши

-~{}~ 15.08.05 18:53:

в конце концов
можно свести
к такой сруктуре
минимальное количество цифр в коде оператора+префик
например получается 6
а дальше допкод_для_префикса

делаешь запрос, если результатов больше одного в цикле
сравниваешь уже с учетом допкода
 

demon_mhm

Новичок
Вот, уже гораздо ближе к тебе, сасибо большое, завтра попробую, сам тоже о чем-то таком думал... Чего получится - напишу.
 

antson

Новичок
Партнер клуба
еще вариант
все храниться в одном поле (код и префикс)

делаем в цикле запросы
for($i=11;$i>2;$i--){
$x=substr($nomer,0,$i);
select где поле = $x
если нашли окей, выходим из цикла
}
 

demon_mhm

Новичок
Автор оригинала: antson
demon_mhm
добавь в where проверку перед
своим условием
r.op_code = 'трицифрыизномера' and
неподходящие записи будут давиться а сложная проверка
пойдет только для записей конкретного оператора.

насколько быстрее станет напиши

На этом условии выиграл полсекунды, что неплохо...

-~{}~ 15.08.05 18:53:

в конце концов
можно свести
к такой сруктуре
минимальное количество цифр в коде оператора+префик
например получается 6
а дальше допкод_для_префикса

Выбирать все префиксы плохо, так как у оператора может быть многовато (в идеале до 999) постфиксов на один префикс, а так как сервис расчитан на большую нагрузку, то будет сильно грузить память, поэтому я и хочу все сделать в запросе. пущай мускул разгребается

делаешь запрос, если результатов больше одного в цикле
сравниваешь уже с учетом допкода
Опять таки память грузить...

-~{}~ 16.08.05 13:46:

Автор оригинала: antson
еще вариант
все храниться в одном поле (код и префикс)

делаем в цикле запросы
for($i=11;$i>2;$i--){
$x=substr($nomer,0,$i);
select где поле = $x
если нашли окей, выходим из цикла
}
Хорошая идея... В одно поле сваливать необязательно, можно concat сделать, хотя надо посмотреть, не тормознет ли это запрос.... Спасибо большое за советы
Нее... с concat-ом отрабатывает за 1.25 сек, а это, если учесть, что придется не один раз запрашивать есть слишком долго, попробую слить поля
Слил, запрос занимает теперь 0.6 сек, думаю пойдет...
Хотя при средней длине префикса и постфикса в 6 цифр в большинстве случаев придется делать 4 лишних запроса... А это те же 3 секунды...

-~{}~ 16.08.05 14:35:

Остановился на таком варианте, тут мы начинаем с шести цифр и идем до конца, так сразу находятся самы распространенные шестициферные префиксы:
PHP:
function get_op_reg($phone_num)
{
	$found = false;
	$result = array();
	for ($i=6;$i<=strlen($phone_num); $i++)
	{
		$query='SELECT  p.prefix,o.standart,o.oper,r.region,r.region_id
	            FROM prefixes p,operators o, regions r
	            WHERE p.prefix = "'.substr($phone_num,0,$i).
				'" AND p.oper_code=o.code
	            AND p.region_code=r.code';
		$dblink = mysql_connect(HOST,USER ,PASS )
	          or die("Could not connect");
		mysql_select_db("region_phones") 
	          or die("Could not select database");
		$dbresult = mysql_query($query,$dblink) or die ('shit in SQL!');
		while ($line = mysql_fetch_array($dbresult, MYSQL_ASSOC))
			$result[]=$line;
		print_r ($result);
		if (sizeof($result) > 0) $found = true;
		if (0 == sizeof($result)  && $found) // если нашли в прошлом проходе 
              //и не нашли в этом, то возвращаем результат, больше искать нечего
		     return $resut;
	}
    return $result;
}
Хотя все равно не так быстро как хотелось бы...
 

chira

Новичок
Код:
SELECT op_name
FROM regions_operators r
WHERE '$phone_num' LIKE concat(r.op_code,r.prefix,'%')
 

antson

Новичок
Партнер клуба
demon_mhm
на стадии поиска не таскай в запросе все поля выбирай только ключ записи должно быть пошустрее.
плюс не делай объединений таблиц. иши только по prefix.

после расшифруешь все эти вещи

-~{}~ 17.08.05 08:52:

избавление от соединения строк нам уже дало выигрыш в полсекунды . попробуй ввести индексированное поле с длиной этого поля и в запросе первым условием concatLen=сколько_сейчас_в_анализируемой_части.

каждый последующий запрос должен выполняться шустрее
 
Сверху