Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2013, 18:05   #1
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию Поиск по большему совпадению

Добрый вечер. Пожалуйста подскажите как сделать поиск в базе данных по наиболее подходящим символам. В общем есть база данных:

11638 130 WF0GXXGBBG??????? NULL
11605 131 WF0EXXGCDE??????? NULL
11656 137 ???PXX??D???????? NULL

Через форму я получаю - X9FPXXEEDPBD61875, как сделать так чтобы при помощи SQL запроса я нашел наиболее подходящею строчку? Т.е. на выходе должно быть -

11656 137 ???PXX??D???????? NULL
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана
Rost93 вне форума Ответить с цитированием
Старый 29.10.2013, 11:44   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Тут нужно однозначно определиться - что такое наиболее подходящая строчка. В зависимости от этого и будет решение или нет. Для общего случая точно не будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.10.2013, 16:25   #3
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию

А можно ли сделать так чтобы поиск происходил по первому, второму и т.д. символу в ячейки?

Т.е. я думаю сделать так:
1- Разбить "X9FPXXEEDPBD61875" на символы
2- Искать "X" в первых символах ячейки. Получу массив в которым будут все стоки с "Х" и с "?" в начале.
3- Среди этого массива искать "9", получу с "Х9" или "X?" или "?9" и т.п.

В итоги найду наиболее подходящею строчку =)

В общем скажите пожалуйста, как сделать так чтобы поиск происходил по первому, второму и т.д. символу в ячейки?
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана
Rost93 вне форума Ответить с цитированием
Старый 30.10.2013, 17:29   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

MS SQL
Код:
id       | item 
11638 130| WF0GXXGBBG??????? NULL
Код:
select id, count(nn)
from ( select id,  1 as nn from list where substring(item, 1,1) =substring('.....', 1,1) --совпадения по первому символу
 union select id,  2 as nn from list where substring(item, 2,1) =substring('.....', 2,1) 
    ...
 union select id, 17 as nn from list where substring(item,17,1) =substring('.....',17,1) --совпадения по последнему символу
    ) as calclist
group id -- собираем одинаковые и считаем их повторы(count)
order by 2 desc --сортируем в порядке убывания числа повторов
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.10.2013 в 17:31.
evg_m вне форума Ответить с цитированием
Старый 30.10.2013, 17:35   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

ужас .
eval вне форума Ответить с цитированием
Старый 30.10.2013, 18:32   #6
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию

evg_m, честно говоря не понял структуру Вашего запроса. Подставил просто свои значения. Получаю ошибку - "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource"

Подскажите пожалуйста как правильно все написать.

Код:
$nam_VINMask = mysql_query("select CatalogueId, count(nn)
from ( select CatalogueId,  1 as nn from VINMaskToCatalogue where substring(VINMask, 1,1) =substring('X9F5XXEED55A12345', 1,1)
 union select CatalogueId,  2 as nn from VINMaskToCatalogue where substring(VINMask, 2,1) =substring('X9F5XXEED55A12345', 2,1)
 union select CatalogueId,  3 as nn from VINMaskToCatalogue where substring(VINMask, 3,1) =substring('X9F5XXEED55A12345', 3,1)
 union select CatalogueId,  4 as nn from VINMaskToCatalogue where substring(VINMask, 4,1) =substring('X9F5XXEED55A12345', 4,1)
 union select CatalogueId,  5 as nn from VINMaskToCatalogue where substring(VINMask, 5,1) =substring('X9F5XXEED55A12345', 5,1)
 union select CatalogueId,  6 as nn from VINMaskToCatalogue where substring(VINMask, 6,1) =substring('X9F5XXEED55A12345', 6,1)
 union select CatalogueId,  7 as nn from VINMaskToCatalogue where substring(VINMask, 7,1) =substring('X9F5XXEED55A12345', 7,1)
 union select CatalogueId,  8 as nn from VINMaskToCatalogue where substring(VINMask, 8,1) =substring('X9F5XXEED55A12345', 8,1)
 union select CatalogueId,  9 as nn from VINMaskToCatalogue where substring(VINMask, 9,1) =substring('X9F5XXEED55A12345', 9,1)
 union select CatalogueId,  10 as nn from VINMaskToCatalogue where substring(VINMask, 10,1) =substring('X9F5XXEED55A12345', 10,1)
 union select CatalogueId,  11 as nn from VINMaskToCatalogue where substring(VINMask, 11,1) =substring('X9F5XXEED55A12345', 11,1)
 union select CatalogueId, 12 as nn from VINMaskToCatalogue where substring(VINMask, 12,1) =substring('X9F5XXEED55A12345', 12,1)
 union select CatalogueId,  13 as nn from VINMaskToCatalogue where substring(VINMask, 13,1) =substring('X9F5XXEED55A12345', 13,1)
 union select CatalogueId,  14 as nn from VINMaskToCatalogue where substring(VINMask, 14,1) =substring('X9F5XXEED55A12345', 14,1)
 union select CatalogueId,  15 as nn from VINMaskToCatalogue where substring(VINMask, 15,1) =substring('X9F5XXEED55A12345', 15,1)
 union select CatalogueId,  16 as nn from VINMaskToCatalogue where substring(VINMask, 16,1) =substring('X9F5XXEED55A12345', 16,1)
 union select CatalogueId,  17 as nn from VINMaskToCatalogue where substring(VINMask, 17,1) =substring('X9F5XXEED55A12345', 17,1)

    ) as calclist group CatalogueId order by 2 desc ");
                    $my_VINMask = mysql_fetch_array($nam_VINMask);
                    echo $my_VINMask['CatalogueId'];
CatalogueId - Это Id мне нужно получить
VINMask - Это то где WF0GXXGBBG??????? и т.п.
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана

Последний раз редактировалось Rost93; 30.10.2013 в 18:38.
Rost93 вне форума Ответить с цитированием
Старый 31.10.2013, 12:53   #7
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию

Разобрался сам. Может кому нибудь поможет =)

Код:
          
                    //Инициализируем переменные
                    $vin = $_POST['vin'];
                    $arr_vin = str_split($vin);//То что ищут разбиваем по символам
                    $count = 100;
                    $vin_arr = array();
                    $vin_arr_res = array();
                    
                    //Все возможные маски заносим в массив
                    $nam_VINMask = mysql_query("SELECT `CatalogueId`,`VINMask`  FROM `VINMaskToCatalogue` ");
                    $my_VINMask = mysql_fetch_array($nam_VINMask);
                    do
                    {
                        $key = $my_VINMask['VINMask'];
                        $vin_arr[$key] = $my_VINMask['CatalogueId'];
                    }while($my_VINMask = mysql_fetch_array($nam_VINMask));

                    //Посимвольно каждую маску сравниваем с тем что ищут. 
                    foreach($vin_arr as $mask => $cat_id){

                        $arr_mask = str_split($mask);
                        for($i = 0; $i <= 17; $i++){
                            if($arr_mask[$i] == '?' or $arr_mask[$i] == $arr_vin[$i]){
                                $count = $count - 1;
                            }
                        }
                        $vin_arr_res[$mask] = $count;
                        $count = 100;
                    }

                    //В каком элементе массива больше совпадений, выводим его на экран.
                    $index_min='';
                    foreach($vin_arr_res as $k=>$v) {
                        if ($index_min=='') {$index_min=$k; $min=$vin_arr_res[$k];}
                        if ($vin_arr_res[$k] < $min) {
                            $index_min = $k;
                            $min=$vin_arr_res[$k];
                        }
                    }
                    echo $index_min;
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана
Rost93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена данных в ячейках по совпадению Poltavtcev Microsoft Office Excel 3 18.03.2012 16:52
Поиск по неполному совпадению sarova Microsoft Office Excel 3 17.07.2011 13:46
Связать таблицы по совпадению ключей Xupacuma Microsoft Office Access 3 20.12.2010 13:13
Суммирование по неполному совпадению alexvav Microsoft Office Excel 9 22.08.2010 21:39
Поиск данных по частичному совпадению aston Microsoft Office Excel 2 05.04.2008 23:07