val1 VARCHAR(10),
val2 VARCHAR(100)
В ней следующие данные
1234 Тест1
12345 Тест2
123456 Тест3
и имеем значение 1234567890, по которому нужно найти наиболее полное вхождение. В нашем случае это 123456 Тест3.
Какие у вас соображения есть?
Спустя 1 час, 4 минуты, 49 секунд (21.02.2011 - 14:55) Zerstoren написал(а):
Достать данные можно через регулярку. (Отправить команду на поиск по регулярке)
А релевантность уже обрабатывать в пхп коде.
сначала пробить на точные вхождения.
Если они есть, то дать ему высший уровень релевантности, далее в цикле пробивать
содержимое на substr_count
И снова-же, присваивать им некие балы для релевантности.
Но это только теория, по логике - это воплотимо, но очень тяжелый алгоритм получится.
А релевантность уже обрабатывать в пхп коде.
сначала пробить на точные вхождения.
Если они есть, то дать ему высший уровень релевантности, далее в цикле пробивать
содержимое на substr_count
И снова-же, присваивать им некие балы для релевантности.
Но это только теория, по логике - это воплотимо, но очень тяжелый алгоритм получится.
Спустя 6 минут, 50 секунд (21.02.2011 - 15:02) Snus написал(а):
Zerstoren
Вот я тоже сижу голову ломаю. В таблице БД у меня 600 строк. Данных для поиска может быть до 200. Я так и планировал, искать по первым 4 цифрам, забивать в массив, а дальше искать большее вхождение пхп-скриптом. У меня это уже реализовано, но мне бы как-нибудь менее ресурсоемко придумать
Господа эксперты, направьте на путь истинный!
Вот я тоже сижу голову ломаю. В таблице БД у меня 600 строк. Данных для поиска может быть до 200. Я так и планировал, искать по первым 4 цифрам, забивать в массив, а дальше искать большее вхождение пхп-скриптом. У меня это уже реализовано, но мне бы как-нибудь менее ресурсоемко придумать
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 1 час, 5 минут, 14 секунд (21.02.2011 - 16:07) Snus написал(а):
Тема все еще актуальна
у кого-нибудь есть варианты реализации?
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 4 часа, 33 минуты, 48 секунд (21.02.2011 - 20:41) Renden написал(а):
Snus
Эм, я может что-то не допонимаю, но в Mysql есть же поиск по релевантности MATCH () AGAINST ()
Ну и если допустим надо несколько стобцов обьединить в 1 можно воспользоватся CONCAT()..
Эм, я может что-то не допонимаю, но в Mysql есть же поиск по релевантности MATCH () AGAINST ()
Ну и если допустим надо несколько стобцов обьединить в 1 можно воспользоватся CONCAT()..
Спустя 2 часа, 4 минуты, 19 секунд (21.02.2011 - 22:45) Snus написал(а):
Renden
Спасибо, конечно, но этот вариант мне совсем не подходит
Спасибо, конечно, но этот вариант мне совсем не подходит
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 10 часов, 35 минут, 37 секунд (22.02.2011 - 09:21) linker написал(а):
А можно узнать конкретное применение этой задачи?
Спустя 15 минут, 15 секунд (22.02.2011 - 09:36) Snus написал(а):
linker
Можно. Я даже более того скажу, что возможно я туплю по-черному. У меня это бывает. Я начинаю разрывать мозг, думая, что задача не из самых легкий, а оказывается все может обойтись одной простой фун-ей.. Ну это я уже от темы ушел.
Так вот. По задаче:
Есть таблица. В ней есть коды от 4 до 10 знаков и описания.
Пример:
Мне нужно найти из всех записей наиболее полное вхождение (сравнение) с искомым кодом.
То есть. Я ввожу 8501402009 и он мне должен выдать то, что выше уже написал, если была бы еще запись с кодом 85014, то выдал бы ее - так как число вхождений больше. И код более соответствует искомому.
Надеюсь, понятно? :)
Можно. Я даже более того скажу, что возможно я туплю по-черному. У меня это бывает. Я начинаю разрывать мозг, думая, что задача не из самых легкий, а оказывается все может обойтись одной простой фун-ей.. Ну это я уже от темы ушел.
Так вот. По задаче:
Есть таблица. В ней есть коды от 4 до 10 знаков и описания.
Пример:
Array
(
[0] => Array
(
[codeX] => 8501
[codeY] =>
[info] => Марка (модель, артикул); тип (например, постоянного, переменного тока, синхронный и т.п.); количество фаз; мощность (Вт); для асинхронных двигателей - высота оси вращения (мм); количество (шт). (технические параметры изделий необходимо контролировать согласно техническому паспорту фирмы - изготовителя, инструкции (руководства) по эксплуатации или аналогичной технической документации, оригинала рекламного каталога и т.п.).
)
)
Мне нужно найти из всех записей наиболее полное вхождение (сравнение) с искомым кодом.
То есть. Я ввожу 8501402009 и он мне должен выдать то, что выше уже написал, если была бы еще запись с кодом 85014, то выдал бы ее - так как число вхождений больше. И код более соответствует искомому.
Надеюсь, понятно? :)
Спустя 1 минута, 59 секунд (22.02.2011 - 09:38) linker написал(а):
А почему ты вводишь 8501402009? 402009 - это что-то значит или просто так?
Спустя 2 минуты, 13 секунд (22.02.2011 - 09:40) Snus написал(а):
linker
8501402009 - это полный код. 8501 - это группа кодов. То есть для всех кодов, начинающихся на 8501 применимо это доп. описание.
8501402009 - это полный код. 8501 - это группа кодов. То есть для всех кодов, начинающихся на 8501 применимо это доп. описание.
Спустя 48 минут, 47 секунд (22.02.2011 - 10:29) Snus написал(а):
Задача немого упростилась. Не нужно наибольших вхождений. Достаточно первого вхождения. По новым данным (сообщили только что) группы уникальны. Не может быть 1234, а затем 12345. Может быть либо-либо.
Решил задачу таким способом. Если есть варианты посолиднее - предлагайте.
array arr:
array codes:
На выходе:
Смысл в том, что codeX - код или группа кодов, в codeY - исключения для этой группы (если это группа).
Вдруг у кого такая же задача будет стоять, то возможно понадобится идея.
Вместо echo ' +'; у меня обработчик стоит. (на тот случай, чтобы не спрашивали, что с этим всем делать)
Всем спасибо! :)
Решил задачу таким способом. Если есть варианты посолиднее - предлагайте.
foreach($codes as &$codeZ){
echo '<p>'.$codeZ.'<br>';
foreach($arr as &$val){
if(substr($codeZ, 0, strlen($val['codeX'])) == $val['codeX']){
$codeY = explode(',', $val['codeY']);
echo $val['codeX'];
if(!in_array($codeZ, $codeY)) echo ' +';
else echo ' -';
break;
}
}
echo '</p>';
}
array arr:
Array
(
[0] => Array
(
[codeX] => 8501
[codeY] =>
[info] => Марка (модель, артикул) ....
)
[1] => Array
(
[codeX] => 8508
[codeY] =>
[info] => Наименование товара ....
)
[2] => Array
(
[codeX] => 9006
[codeY] => 9006910000, 9006990000
[info] => - Уникальные идентификационные номера (серийный заводской номер)
)
)
array codes:
Array
(
[0] => 8501402009
[1] => 8508700001
[2] => 9006910000
[3] => 9006610000
[4] => 9006990000
)
На выходе:
8501402009
8501 +
8508700001
8508 +
9006910000
9006 -
9006610000
9006 +
9006990000
9006 -
Смысл в том, что codeX - код или группа кодов, в codeY - исключения для этой группы (если это группа).
Вдруг у кого такая же задача будет стоять, то возможно понадобится идея.
Вместо echo ' +'; у меня обработчик стоит. (на тот случай, чтобы не спрашивали, что с этим всем делать)
Всем спасибо! :)