Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск в БД по разным полям
 
 автор: SS   (30.04.2005 в 23:09)   письмо автору
 
 

Cheops, помогите, пожалуйста, с поиском по БД.

Нужно реализовать поиск как общий, так и по разным полям.
Совпадения: полное, с любой частью слова
Логика: AND, OR
Регистр: важен, не важен

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

input - искать по всем полям однойт аблицы
input1 - искать по такому-то полю
input2 - искать по такому-то полю
input3 - искать по такому-то полю
условия (совпадения, логика, регистр) - одни для всех input'ов

   
 
 автор: cheops   (30.04.2005 в 23:41)   письмо автору
 
   для: SS   (30.04.2005 в 23:09)
 

1) Под общим поиском, что подразумевается?
2) Искать планируется при помощи LIKE(RLIKE) или полнотекстовым поиском? http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1991
3) С регистром скорее всего ничего не получится. Все текстовые столбцы в MySQL регистронезависимые, можно конечно их принудительно сделать регистрозависимыми при помощи BINARY, но тут теряется массу преимуществ и в первую очередь скорость.

По ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1991 приводится ещё три ссылке, которые наверное стоит почитать - это пожалуй лучшие ссылки по поиску в нашем форуме.

Хм... а структура таблицы какая?

   
 
 автор: SS   (01.05.2005 в 04:35)   письмо автору
 
   для: cheops   (30.04.2005 в 23:41)
 

Пытаюсь разобраться.
Если одно из полей не заполнено, - как его игнорировать? (всего идет поиск по 10-15 полям).

$query = "SELECT *
FROM coins
WHERE
nominal RLIKE '".$nominal."' AND ruler RLIKE '".$ruler."'

   
 
 автор: cheops   (01.05.2005 в 12:39)   письмо автору
 
   для: SS   (01.05.2005 в 04:35)
 

Обработку незаполненых полей обычно производят средствами PHP, так как он более чем SQL для этого подходит. Подробности в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=3723

   
 
 автор: SS   (07.05.2005 в 12:53)   письмо автору
 
   для: cheops   (01.05.2005 в 12:39)
 

Что у меня здесь не так?


if(!empty($ruler))
$tmp1 = "ruler RLIKE '$ruler'"; else "";
if(!empty($nominal))
$tmp2 = "nominal RLIKE '$nominal'"; else "";

// Формируем запрос на выборку изображений
$query = "SELECT *
FROM coins
WHERE $tmp1 AND $tmp2";

   
 
 автор: cheops   (07.05.2005 в 12:59)   письмо автору
 
   для: SS   (07.05.2005 в 12:53)
 

После else отсутствует переменная и присваиваивание
<?php
if(!empty($ruler)) $tmp1 "ruler RLIKE '$ruler'";
else 
$tmp1 ""
if(!empty(
$nominal)) $tmp2 "nominal RLIKE '$nominal'";
else 
$tmp2 ""

// Формируем запрос на выборку изображений 
$query "SELECT * 
FROM coins 
WHERE 
$tmp1 AND $tmp2";
?>

   
 
 автор: SS   (07.05.2005 в 14:17)   письмо автору
 
   для: cheops   (07.05.2005 в 12:59)
 

Что-то не хочет искать. Ищет, если только заполнены оба поля. Если одно - ругается: You have an error in your SQL syntax.

   
 
 автор: cheops   (08.05.2005 в 00:48)   письмо автору
 
   для: SS   (07.05.2005 в 14:17)
 

А ну да, и не должен отображаться, так как мы забыли AND, следует изменить код, примерно следующим образом:
<?php 
if(!empty($ruler)) $tmp1 "ruler RLIKE '$ruler'"
else 
$tmp1 ""
if(!empty(
$nominal)) $tmp2 "nominal RLIKE '$nominal'"
else 
$tmp2 ""
if(
$tmp1 != "" && $tmp2 != ""$and " AND";
else 
$and "";
// Формируем запрос на выборку изображений 
$query "SELECT * 
FROM coins 
WHERE 
$tmp1 $and $tmp2"
?>

   
 
 автор: SS   (08.05.2005 в 01:31)   письмо автору
 
   для: cheops   (08.05.2005 в 00:48)
 

Да, так все работает, спасибо. Однако не самый простой получился запрос для 10-15 полей...
Теперь логика и совпадения на очереди. Если что - звоню :)

   
 
 автор: SS   (08.05.2005 в 05:50)   письмо автору
 
   для: cheops   (08.05.2005 в 00:48)
 

Ага, работает...
Теперь наоборот - ищет, если введено только одно слово. На такой конструкции

WHERE $tmp1 $and $tmp2 $and $tmp3 $and $tmp4 $and $tmp5 $and $tmp6 $and $tmp7 $and $tmp8 $and $tmp9 $and $tmp10 $and $tmp11 $and $tmp12 $and $tmp13 $and $tmp14 $and $tmp15 $and $tmp16 $and $tmp17 $and $tmp18 $and $tmp19 $and $tmp20

я чуть не свихнулся, пока по буковке не дошел...
Cheops, помогите, плиз!!!!! и ничего у меня не получается с поиском по части слова или целиком. Плохо, когда не знаешь, да еще не понимаешь....
:)

   
 
 автор: cheops   (08.05.2005 в 18:14)   письмо автору
 
   для: SS   (08.05.2005 в 05:50)
 

Нет, предыдущая конструкция здесь уже не пойдёт, я просто хотел обратить внимание на AND, тут обычно прибегают к флагу
<?php 
// Если хоть одно поле уже установлено в запросе
// флаг принимает значение true
$flag false;
//
if(!empty($ruler))
{
 if(
$flag)  $tmp1 " AND ruler RLIKE '$ruler'"
 else
 {
   
$flag true;
   
$tmp1 " ruler RLIKE '$ruler'"
 }
}
else 
$tmp1 ""

if(!empty(
$nominal))
{
 
 if(
$flag)  $tmp2 " AND nominal RLIKE '$nominal'";  
 else
 {
   
$flag true;
   
$tmp2 " nominal RLIKE '$nominal'"
 }
}
else 
$tmp2 ""
// и т. д.
// Формируем запрос на выборку изображений 
$query "SELECT * 
FROM coins 
WHERE 
$tmp1 $tmp2"
?>

   
 
 автор: SS   (09.05.2005 в 09:39)   письмо автору
 
   для: cheops   (08.05.2005 в 18:14)
 

Да, так работает, спасибо.
Дальше:
1. В некоторых полях мне нужно вести поиск только по слову целиком, как это сделать? В таком поле может быть несколько слов, но поиск должен вестить по любому из них только целиком. Если ищем "V 2" не должен выводить "IV 21".
2. Поиск в поле по нескольким словам.

   
 
 автор: cheops   (09.05.2005 в 13:55)   письмо автору
 
   для: SS   (09.05.2005 в 09:39)
 

1. Вообще началу слова в регулярных выаржениях соответствует специальных символ ^, а концу $, попробуйте искать "^V 2$", это должно исключить срабатывание на "IV 21".

PS Хотя может пробел помешать... но попробуйте всё равно посмотреть.

2. В HTML-форме будет два режима, поиск по выражению и отдельным словам? Нужно будет разбить строку по пробелу на массив, содержащий в каждом элементе , например при помощи функции explode или preg_splint и в цикле foreach по этому массиву формировать SQL-запрос.

   
 
 автор: SS   (09.05.2005 в 16:21)   письмо автору
 
   для: cheops   (09.05.2005 в 13:55)
 

1. Проверил - не работает.
2. Если можно, то лучше небольшой пример, а то так не очень понятно...
Да, два режима - точное соответствие фразе (это сейчас так ищет) и поиск по отдельным словам, но чтобы оба слова были в поле, а не любое из них.

   
 
 автор: SS   (10.05.2005 в 19:47)   письмо автору
 
   для: cheops   (09.05.2005 в 13:55)
 

Все еще надеюсь за выходные сделать поиск... :)

   
 
 автор: cheops   (11.05.2005 в 12:50)   письмо автору
 
   для: SS   (10.05.2005 в 19:47)
 

Не додумался ещё как 1 задачу решить, постраюсь сегодня вечером отписаться.

   
 
 автор: cheops   (11.05.2005 в 23:13)   письмо автору
 
   для: SS   (10.05.2005 в 19:47)
 

Наверное можено решить обе проблемы, если действительно следовать по пути жёсткого поиска. Пусть из HTML-формы в обработчик поступает строка $_POST['search'] - в которой поисковые слова разделены пробелами. Разбиваем эту фразу на массив слов
<?php
  $words 
explode(" "$_POST['search']);
?>

после того, как получен массив $words, следует, если в нём более одного элемента формировать и выполнять запрос
<?php
  
if(count($words)>0)
  {
    
$flag false;
    foreach(
$words as $line)
    {
      if(
$flag)
      {
        
$query .= " nominal RLIKE '^$nominal\$";
        
$flag true;
      }
      else 
$query .= " AND nominal RLIKE '^$nominal\$";
    }
    
$query "SELECT * FROM coins ".$query;
    
$src mysql_query($query);
    if(!
$src) exit(mysql_error());
    
// Далее вывод результатов
  
}
?>

   
 
 автор: SS   (13.05.2005 в 00:46)   письмо автору
 
   для: cheops   (11.05.2005 в 23:13)
 

Все, замучался. У меня ничего не получается.... Ни с несколькими условиями, ни с одним, может операторы не там ставлю, может еще чего.
Посмотрите, пожалуйста, вложенный файл. Это предыдущий вариант, который нормально работал, до последних заметок.
Как должно быть на самом деле теперь, после добавления новых условий? Буду признателен.

   
 
 автор: cheops   (13.05.2005 в 13:21)   письмо автору
 
   для: SS   (13.05.2005 в 00:46)
 

Сейчас убегаю, вечером постараюсь посмотреть.

   
 
 автор: cheops   (14.05.2005 в 14:18)   письмо автору
 
   для: SS   (13.05.2005 в 00:46)
 

Давайте пока на примере keyword отработаем - будет работать или нет, как только всё будет отлажено, можно будет переходить на другие части SQL-запроса.

   
 
 автор: SS   (14.05.2005 в 20:12)   письмо автору
 
   для: cheops   (14.05.2005 в 14:18)
 

Нет, не работает:

"You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND keywords RLIKE '^виктория$) ORDER BY date_"

   
 
 автор: cheops   (14.05.2005 в 23:30)   письмо автору
5.8 Кб
 
   для: SS   (14.05.2005 в 20:12)
 

Есть такое дело, вот новый вариант.

   
 
 автор: SS   (15.05.2005 в 17:02)   письмо автору
 
   для: cheops   (14.05.2005 в 23:30)
 

Не работает. Появляется то же самое сообщение.

   
 
 автор: cheops   (15.05.2005 в 17:59)   письмо автору
 
   для: SS   (15.05.2005 в 17:02)
 

Исправлено, теперь ошибка из-за неопределённых переменных $begin и $pnumber.

   
 
 автор: SS   (15.05.2005 в 19:06)   письмо автору
 
   для: cheops   (15.05.2005 в 17:59)
 

Не ругается, но и ничего не находит. Набираю для проверки, конечно, слова, заведомо присутствующие. Нет результатов как для поиска по одному слову, так и по нескольким словам.

   
 
 автор: cheops   (16.05.2005 в 01:17)   письмо автору
 
   для: SS   (15.05.2005 в 19:06)
 

Выведите оперетором echo результирующий SQL-запрос, как он выглядит?
<?php
  
echo $query;
?>

   
 
 автор: SS   (16.05.2005 в 22:02)   письмо автору
 
   для: cheops   (16.05.2005 в 01:17)
 

SELECT * FROM coins WHERE ( keywords RLIKE '^виктория$' AND keywords RLIKE '^венок$' ) ORDER BY date_start, RIC, RIC_n, RIC_add LIMIT 0, 10

   
 
 автор: cheops   (18.05.2005 в 00:17)   письмо автору
 
   для: SS   (16.05.2005 в 22:02)
 

Скорее всего не нравятся ограничители ^ и $ - попробуйте их пока убрать.

   
 
 автор: SS   (19.05.2005 в 22:22)   письмо автору
 
   для: cheops   (18.05.2005 в 00:17)
 

Убрал. Поиск и выборка производятся правильно. Но нужно, чтобы искало слово целиком.

   
 
 автор: cheops   (20.05.2005 в 00:45)   письмо автору
 
   для: SS   (19.05.2005 в 22:22)
 

Вместо ^ и $ подставьте [[:<:]] и [[:>:]], соответственно.

   
 
 автор: SS   (20.05.2005 в 19:46)   письмо автору
 
   для: cheops   (20.05.2005 в 00:45)
 

Да, супер, работает! Буду пробовать дальше с остальными полями. Если не получиттся что - напишу.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования