|
|
|
| Может ли иметь место такой запрос
<?php
$zap_poi = "SELECT * FROM table WHERE fam,name,sour,dolj,otdel,cab LIKE '%$poisk_slovo%'";
?>
|
Суть проблемы - человек забивает в строку запроса несколько слов (Фамилия и имя - к примеру).
Поиск по каждому из слов я реализовал - теперь хочу реализовать поиск по фразе, чтобы найти точные совпадения. | |
|
|
|
|
|
|
|
для: 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%'";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(25.12.2010 в 17:59)
| | Да именно так я реализовал поиск, когда человек набрал напрмер ИВанов Василий и ему выдались запросы по Иванов и по Василий, а как найти точное соответствие? Искать по первому запросу - потом в найденном по второму? или есть более легкий и граммотный путь? | |
|
|
|
|
|
|
|
для: Vincento
(25.12.2010 в 20:17)
| | точное, а без %-ов разве ищется не точное соответствие? | |
|
|
|
|
|
|
|
для: 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%'";
?>
|
А вообще обычно реализуют два вида поиска - просто строка и запрос, который был приведен выше и расширенный поиск, где для каждого из полей таблицы предусмотрен свой элемент управления - в этом случае можно более точно сформировать запрос, в том числе выбирая логику поиска. | |
|
|
|
|
|
|
|
для: 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 этой записи - но немного сложно получилось - много кода.
Я просто думал что можно вытащить единственное соответствие с помощью одного запроса | |
|
|
|
|
|
|
|
для: Vincento
(26.12.2010 в 12:18)
| | . | |
|
|
|
|
|
|
|
для: Vincento
(26.12.2010 в 12:18)
| | Вместо одного запроса вам нужно делать три отдельных поля для "Иванов", для "Иван" и для "1", и соответственно три переменные. Так как вместо "Иванов Иван 1" могут ввести "Иван 1 Иванов" и различить порядок у вас нет возможности, да и пользователи будут путаться и ничего не найдут. | |
|
|
|
|
|
|
|
для: cheops
(26.12.2010 в 13:31)
| | ну собственно так и сделал. разделил регуляркой строку поиска по пробелам, потом по количеству разделенных слов сделал соотв. количество запросов ,выбрав id, потом тупо сравнивал id - где совпадали - слепливал в кучу. Соответственно вывод если количество совпавших id > 1 ))))) только думаю наверное можно как-то проще сделать! ? )) | |
|
|
|
|
|
|
|
для: Vincento
(26.12.2010 в 15:03)
| | Вы, очевидно, либо не прочли, что Вам написали, либо не захотели понять. | |
|
|
|
|
|
|
|
для: Trianon
(26.12.2010 в 18:03)
| | что именно я не прочел? советы многоуважаемых я принял во внимание. Я просто хотел узнать если есть возможность икать как - "%any%" то можно ли одним запросом пройтисьпо всем полям? и все. | |
|
|
|
|
|
|
|
для: Vincento
(27.12.2010 в 11:54)
| | Было предложено создать три отдельных поля формы.
Вы пишете: ну собственно так и сделал. разделил регуляркой строку поиска по пробелам.
Разница есть? | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: lightning.say
(26.12.2010 в 10:27)
| | Да, корректно.
PS Могут возникнуть сложности с различными кодировками переменной @s и полей таблицы table, но их можно разрешить при помощи функции CONVERT(). | |
|
|
|