Forum Webscript.Ru
Общие => Базы данных => Тема начата: UltraMax от 30 Апреля 2003, 13:42:15
-
Есть Excel файло, с тремя столбцами (каждый столбец - набор данных)
Все это надо перенести в мускул с целью дальнейшего поиска по этим данным.
Все данные - цифры. Формат следующий:
в первом столбце (365)543
во втором и третьем (123)567, 438, 762 и т.д. Потом может идти еще раз (765)432, 975, 434 и т.д. (все цифры от балды). Цифры в скобках - это префикс, который в принципе добавляется к каждому числу (трехзначному), идущему после префикса.
Необходимо искать по третьему и вторым столбцам, и выводить соотвествующее найденное из первого столбца
Причем для поиска вводится данные с префиксом - то есть шестизначное число.
Всего в Excel чуть больше 4000 строк
Вопрос - как лучше организовать таблицу? В частности какими поля создавать для данных? И как разобраться с префиксом? Сделать для него отдельное поле и при поиске искать сначала по нему, а потом уже по остальным трем цифрам?
Самое гадское - что надо сделать срочно достаточно :(
Спасибо за любую помощь. Не дайци пагибнуть :)
-
Все - вопрос решился путем изменения структуры таблицы на более подходящую :)
Ну а залить из Excel в MySql оказалось проще простого
В Word открыл Excel таблицу - преобразовал таблицу в текст с разделителями табуляции и залил текстовый файл используя LOAD DATA
Кстати LOAD DATA LOCAL ругалось, и не заливало. Спасибо есть на сайте MySQl есть документация + мнения, где и написали что LOCAL надо опустить. :)
-
У меня теперь другой вопрос :)
у меня поле в котором ищется число имеет тип TEXT и записи там хранятся в виде
20; 542; 453; 348; и т.п.
и их может быть много (около сотни)
мне нужно заселектить то поле, в котором будет именно то число которое я ищу! Например 20
как мне лучше сделать запрос - чтобы было именно 20 (искать "20;"???)
что мне написать в WHERE чтобы нашло именно те строчки (строчку) где есть 20; а не 120; или 203;
???
-
Ппробуй
WHERE column_name REGEXP \' 20;\'
-
Да, забыл....
В REGEXP используется синтаксис регулярных выражений
-
Спасибо помогло
и последний (надеюсь) вопрос :)
у меня в БД MySql три таблицы
в двух из них rate и local называются три поля
id, number, prefix
из формы запросом идут две цифры - сотвтественно number и prefix, надо сначала в local найти а если нет - то в rate найти строку где и prefix и number совпадают и выдернуть оттуда id
а потом в третей колонки (там id поле и number) на основании id найденного - выдернуть number (колнка называется output)
не подскажешь как это лучше сделать
я вроде делаю так
SELECT output.number FROM input_local_center,output WHERE input_local_center.prefix REGEXP "330" and input_local_center.number REGEXP "203";
но выдает 5 тышш записей с лишним вместо одной
где грабли?
-
Честно говоря не понял.... подробнее объясни....
А где у тебя в запросе хоть раз упоминается о значении поля id?
-
в общем так
три таблицы
output, input_local_center, input_rate_center
во 2-ой и третьей есть поля id, prefix, number
надо искать сначала в input_local_center, потом в input_rate_center(если в local не найдется) то что будет введено из HTML формы (будет вводиться prefix и number)
как найдет - берет id из табицы, и селектит поле number уже по этому id в таблице output строчку (там есть тоже поле id)
все
вот собсно как мне правильно запрос составить? не подскажете :)
-
А какая версия MySQL?
Если ниже 4, то только двумя запросами (или тремя если в первой таблице запрос ничего не выдает) ИМХО, т.е. тебе в начале нужно сделать запрос к первой, потом если в первой ничего нет, то во второй найти нужное поле, а потом по выбранному значению id запросить number из третьей таблицы....
т.е
SELECT DISTINCT id FROM input_local_center,input_rate_center WHERE prefix=10 AND number=25
сохраняешь результат запроса в ID
SELECT number FROM output WHERE id=ID
-
ЭЭЭЭ - на сколько я понял вложенные запросы только с версии 4.1 и а не с 4.0, так что увы только несколько запросов :(
Далее - я пробовал уже твой вариант, но все дело в том, что сохранить результат запроса в id можно - но если у меня их несколько? То он вроде не прокатывает во втором select-e - ругается на неправильный запрос
так что я сделал временную таблицу - и в нее результаты выборки кидаю. А затем уже из нее второй SelECT
Кстати - уточнение можно?
Мне надо использовать поиск по второй таблице ТОЛЬКО если в первой ничего нет. Если в первой нашлось - то вторую select-ить не надо.
В твоем SELECT-e вроде как по любому будет в двух таблицах искать. Или я не прав?
-
> охранить результат запроса в id можно - но если у меня их несколько?
SELECT ... WHERE id in (ID1, ID2, .., IDN);
> Если в первой нашлось - то вторую select-ить не надо.
ну так в чем проблема то?
перед тем как выполнять второй запрос сделай проверку
-
>перед тем как выполнять второй запрос сделай проверку
это я и сам понимаю что надо делать проверку. Каким образом лучше бы подсказал.
-
UltraMax
Да прав.
А на каком языке пишешь?
-
C++, ну не на перле же :) Стал бы я в этот топик писать.
PHP 4.3.1
-
$result=mysql_query("SELECT id FROM input_local_center WHERE prefix=\'$prefix\' AND number=\'$number\'");
if(!mysql_num_rows($result))
{
$result=mysql_query("SELECT id FROM input_rate_center WHERE prefix=\'$prefix\' AND number=\'$number\'");
}
if(mysql_num_rows($result)#Если есть выбранные строки, то формируем запрос к output
{
$query="SELECT number FROM output WHERE id IN(";
while($id=mysql_fetch_array($result))
{
$query.=$id["id"].",";
}
#Удалить из $query нпоследнюю запятую, я в PHP не силен, поэтому не нашел как это сделать
$query.=")";
$number=mysql_query($query);
#Извлекаешь все найденные записи и работаешь с ними
}
-
В общем я не совсем так делал (использовал временные таблицы) у меня вот как получилось, что скажут спецы по этому поводу?
# это из форму получаю и еще один фикс. номер
$areacode=$HTTP_POST_VARS[\'areacode\'];
$prefix=$HTTP_POST_VARS[\'prefix\'];
$final=4567;
/* Performing SQL query */
mysql_query("CREATE TEMPORARY TABLE tmp (id SMALLINT(4))") or die("
Cannot create tmp table:" . mysql_error());
// mysql_query("LOCK TABLES output input_local_center READ") or die("
Cannot lock tables:" . mysql_error());
$result=mysql_query("SELECT id FROM input_local_center
WHERE prefix=$areacode AND number REGEXP \'.*$prefix;.*\'");
if(mysql_num_rows($result)>0) {
mysql_query("INSERT INTO tmp SELECT id FROM input_local_center
WHERE prefix=$areacode AND number REGEXP \'.*$prefix;.*\'") or die("
Insert into tmp table failed:" . mysql_error());
}
if(mysql_num_rows($result)==0) {
mysql_query("INSERT INTO tmp SELECT id FROM input_rate_center
WHERE prefix=$areacode AND number REGEXP \'.*$prefix;.*\'") or die("
Insert into tmp table failed:" . mysql_error());
}
$query="SELECT output.number,output.state,output.ratecenter FROM output, tmp WHERE output.id=tmp.id";
$result = mysql_query($query) or die("
Query failed:" . mysql_error());
$num_rows = mysql_num_rows($result);
// mysql_query("UNLOCK TABLES; ") or die("
Cannot unlock tables:" . mysql_error());
mysql_query("DROP TABLE tmp") or die("
Drop tmp table failed:" . mysql_error());
?>
почти все ок - но иногда кажись не те данные выданет... или я напутал в сравнении
Код то сам ок?