Forum Webscript.Ru

Общие => Базы данных => Тема начата: UltraMax от 30 Апреля 2003, 13:42:15

Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 30 Апреля 2003, 13:42:15
Есть Excel файло, с тремя столбцами (каждый столбец - набор данных)
Все это надо перенести в мускул с целью дальнейшего поиска по этим данным.
Все данные - цифры. Формат следующий:
в первом столбце (365)543
во втором и третьем (123)567, 438, 762 и т.д. Потом может идти еще раз (765)432, 975, 434 и т.д. (все цифры от балды). Цифры в скобках - это префикс, который в принципе добавляется к каждому числу (трехзначному), идущему после префикса.
Необходимо искать по третьему и вторым столбцам, и выводить соотвествующее найденное из первого столбца
Причем для поиска вводится данные с префиксом - то есть шестизначное число.
Всего в Excel чуть больше 4000 строк
Вопрос - как лучше организовать таблицу? В частности какими поля создавать для данных? И как разобраться с префиксом? Сделать для него отдельное поле и при поиске искать сначала по нему, а потом уже по остальным трем цифрам?
Самое гадское - что надо сделать срочно достаточно :(
Спасибо за любую помощь. Не дайци пагибнуть :)
Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 30 Апреля 2003, 17:43:41
Все - вопрос решился путем изменения структуры таблицы на более подходящую :)
Ну а залить из Excel в MySql оказалось проще простого
В Word открыл Excel таблицу - преобразовал таблицу в текст с разделителями табуляции и залил текстовый файл используя LOAD DATA
Кстати LOAD DATA LOCAL ругалось, и не заливало. Спасибо есть на сайте MySQl есть документация + мнения, где и написали что LOCAL надо опустить. :)
Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 30 Апреля 2003, 17:55:02
У меня теперь другой вопрос :)
у меня поле в котором ищется число имеет тип TEXT и записи там хранятся в виде
20; 542; 453; 348; и т.п.
и их может быть много (около сотни)
мне нужно заселектить то поле, в котором будет именно то число которое я ищу! Например 20
как мне лучше сделать запрос - чтобы было именно 20 (искать "20;"???)
что мне написать в WHERE чтобы нашло именно те строчки (строчку) где есть 20; а не 120; или 203;
???
Название: организация MySql таблицы из Excel
Отправлено: C++ от 30 Апреля 2003, 19:33:26
Ппробуй
WHERE column_name REGEXP \' 20;\'
Название: организация MySql таблицы из Excel
Отправлено: C++ от 30 Апреля 2003, 19:35:52
Да, забыл....
В REGEXP используется синтаксис регулярных выражений
Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 30 Апреля 2003, 20:19:04
Спасибо помогло
и последний (надеюсь) вопрос :)
у меня в БД 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 тышш записей с лишним вместо одной
где грабли?
Название: организация MySql таблицы из Excel
Отправлено: C++ от 30 Апреля 2003, 21:34:25
Честно говоря не понял.... подробнее объясни....
А где у тебя в запросе хоть раз упоминается о значении поля id?
Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 02 Мая 2003, 20:49:34
в общем так
три таблицы
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 таблицы из Excel
Отправлено: C++ от 02 Мая 2003, 22:17:20
А какая версия 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
Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 03 Мая 2003, 12:43:28
ЭЭЭЭ - на сколько я понял вложенные запросы только с версии 4.1 и а не с 4.0, так что увы только несколько запросов :(
Далее - я пробовал уже твой вариант, но все дело в том, что сохранить результат запроса в id можно - но если у меня их несколько? То он вроде не прокатывает во втором select-e - ругается на неправильный запрос
так что я сделал временную таблицу - и в нее результаты выборки кидаю. А затем уже из нее второй SelECT
Кстати - уточнение можно?
Мне надо использовать поиск по второй таблице ТОЛЬКО если в первой ничего нет. Если в первой нашлось - то вторую select-ить не надо.
В твоем SELECT-e вроде как по любому будет в двух таблицах искать. Или я не прав?
Название: организация MySql таблицы из Excel
Отправлено: fidget от 03 Мая 2003, 14:03:33
> охранить результат запроса в id можно - но если у меня их несколько?

SELECT ... WHERE id in (ID1, ID2, .., IDN);

> Если в первой нашлось - то вторую select-ить не надо.
ну так в чем проблема то?
перед тем как выполнять второй запрос сделай проверку
Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 03 Мая 2003, 14:32:17
>перед тем как выполнять второй запрос сделай проверку

это я и сам понимаю что надо делать проверку. Каким образом лучше бы подсказал.
Название: организация MySql таблицы из Excel
Отправлено: C++ от 03 Мая 2003, 14:56:21
UltraMax
Да прав.
А на каком языке пишешь?
Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 03 Мая 2003, 15:08:03
C++, ну не на перле же :) Стал бы я в этот топик писать.
PHP 4.3.1
Название: организация MySql таблицы из Excel
Отправлено: C++ от 03 Мая 2003, 18:24:10

$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);
      #Извлекаешь все найденные записи и работаешь с ними
   }
Название: организация MySql таблицы из Excel
Отправлено: UltraMax от 03 Мая 2003, 19:55:27
В общем я не совсем так делал (использовал временные таблицы) у меня вот как получилось, что скажут спецы по этому поводу?


# это из форму получаю и еще один фикс. номер
    $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());
    ?>


почти все ок - но иногда кажись не те данные выданет... или я напутал в сравнении
Код то сам ок?