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

Форум MySQL

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

 

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

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

тема: Поиск по нескольким полям
 
 автор: Vincento   (25.12.2010 в 16:38)   письмо автору
 
 

Может ли иметь место такой запрос


<?php
$zap_poi 
"SELECT * FROM table WHERE fam,name,sour,dolj,otdel,cab LIKE '%$poisk_slovo%'";
?>


Суть проблемы - человек забивает в строку запроса несколько слов (Фамилия и имя - к примеру).

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

  Ответить  
 
 автор: cheops   (25.12.2010 в 17:59)   письмо автору
 
   для: Vincento   (25.12.2010 в 16:38)
 

Нет, при таком синтаксисе невозможно. Дело в том, что вам могут потребоваться записи, в каждой из которых, каждому полю имеется соотвествие искомому (логика AND - И) или в одном из них (логика OR - ИЛИ), поэтому для каждого из полей должно быть задано свое условие и каждое из условий должно быть разделено соответсвующим оператором, например:
<?php 
$zap_poi 
"SELECT * FROM table 
WHERE fam LIKE '%
$poisk_slovo%' OR
name LIKE '%
$poisk_slovo%' OR
sour LIKE '%
$poisk_slovo%' OR
dolj LIKE '%
$poisk_slovo%' OR
otdel LIKE '%
$poisk_slovo%' OR
cab LIKE '%
$poisk_slovo%'"
?>

  Ответить  
 
 автор: Vincento   (25.12.2010 в 20:17)   письмо автору
 
   для: cheops   (25.12.2010 в 17:59)
 

Да именно так я реализовал поиск, когда человек набрал напрмер ИВанов Василий и ему выдались запросы по Иванов и по Василий, а как найти точное соответствие? Искать по первому запросу - потом в найденном по второму? или есть более легкий и граммотный путь?

  Ответить  
 
 автор: lightning.say   (26.12.2010 в 10:30)   письмо автору
 
   для: Vincento   (25.12.2010 в 20:17)
 

точное, а без %-ов разве ищется не точное соответствие?

  Ответить  
 
 автор: cheops   (26.12.2010 в 11:28)   письмо автору
 
   для: Vincento   (25.12.2010 в 20:17)
 

Для точного соответствия действительно нужно убирать символы %, хотя бы для имени
<?php  
$zap_poi 
"SELECT * FROM table  
WHERE fam LIKE '%
$poisk_slovo%' OR 
name LIKE '
$poisk_slovo' OR 
sour LIKE '%
$poisk_slovo%' OR 
dolj LIKE '%
$poisk_slovo%' OR 
otdel LIKE '%
$poisk_slovo%' OR 
cab LIKE '%
$poisk_slovo%'";  
?>

А вообще обычно реализуют два вида поиска - просто строка и запрос, который был приведен выше и расширенный поиск, где для каждого из полей таблицы предусмотрен свой элемент управления - в этом случае можно более точно сформировать запрос, в том числе выбирая логику поиска.

  Ответить  
 
 автор: Vincento   (26.12.2010 в 12:18)   письмо автору
 
   для: cheops   (26.12.2010 в 11:28)
 

Да я понял Вас, но вы мне говорите все о том поиске что был приведен тут уже неоднократно.

Смотрите - есть таблица - |Фамилия|Имя|Отчество|Кабинет|
есть запись |Иванов|Иван|Иванович|1
и есть запрос "Иванов Иван 1" - к примеру

я реализовал поиск пока именно так -

<?php
$zap_poi 
"SELECT * FROM table  WHERE fam LIKE '%$poisk_slovo%' OR  name LIKE '%$poisk_slovo%' OR   sour LIKE '%$poisk_slovo%' OR  dolj LIKE '%$poisk_slovo%' OR  
otdel LIKE '%
$poisk_slovo%' OR  cab LIKE '%$poisk_slovo%'";  
?>


и он выдает мне все записи где есть Ивановы и где есть Иваны - это хорошо, но мне нужна 1 запись )))) я уже реализовал поиск именно 1 этой записи - но немного сложно получилось - много кода.

Я просто думал что можно вытащить единственное соответствие с помощью одного запроса

  Ответить  
 
 автор: lightning.say   (26.12.2010 в 13:20)   письмо автору
 
   для: Vincento   (26.12.2010 в 12:18)
 

.

  Ответить  
 
 автор: cheops   (26.12.2010 в 13:31)   письмо автору
 
   для: Vincento   (26.12.2010 в 12:18)
 

Вместо одного запроса вам нужно делать три отдельных поля для "Иванов", для "Иван" и для "1", и соответственно три переменные. Так как вместо "Иванов Иван 1" могут ввести "Иван 1 Иванов" и различить порядок у вас нет возможности, да и пользователи будут путаться и ничего не найдут.

  Ответить  
 
 автор: Vincento   (26.12.2010 в 15:03)   письмо автору
 
   для: cheops   (26.12.2010 в 13:31)
 

ну собственно так и сделал. разделил регуляркой строку поиска по пробелам, потом по количеству разделенных слов сделал соотв. количество запросов ,выбрав id, потом тупо сравнивал id - где совпадали - слепливал в кучу. Соответственно вывод если количество совпавших id > 1 ))))) только думаю наверное можно как-то проще сделать! ? ))

  Ответить  
 
 автор: Trianon   (26.12.2010 в 18:03)   письмо автору
 
   для: Vincento   (26.12.2010 в 15:03)
 

Вы, очевидно, либо не прочли, что Вам написали, либо не захотели понять.

  Ответить  
 
 автор: Vincento   (27.12.2010 в 11:54)   письмо автору
 
   для: Trianon   (26.12.2010 в 18:03)
 

что именно я не прочел? советы многоуважаемых я принял во внимание. Я просто хотел узнать если есть возможность икать как - "%any%" то можно ли одним запросом пройтисьпо всем полям? и все.

  Ответить  
 
 автор: Trianon   (27.12.2010 в 12:32)   письмо автору
 
   для: Vincento   (27.12.2010 в 11:54)
 

Было предложено создать три отдельных поля формы.
Вы пишете: ну собственно так и сделал. разделил регуляркой строку поиска по пробелам.
Разница есть?

  Ответить  
 
 автор: lightning.say   (26.12.2010 в 10:27)   письмо автору
 
   для: cheops   (25.12.2010 в 17:59)
 

вам вопрос как к специалисту, это корректное отображение запроса?

SET @s:='%$poisk_slovo%';
SELECT * FROM table
WHERE fam LIKE @s 
OR sour LIKE @s 
OR dolj LIKE @s
OR otdel LIKE @s
OR  cab LIKE @s;

  Ответить  
 
 автор: cheops   (26.12.2010 в 11:34)   письмо автору
 
   для: lightning.say   (26.12.2010 в 10:27)
 

Да, корректно.

PS Могут возникнуть сложности с различными кодировками переменной @s и полей таблицы table, но их можно разрешить при помощи функции CONVERT().

  Ответить  
Rambler's Top100
вверх

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