Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   PHP (http://www.flasher.ru/forum/forumdisplay.php?f=20)
-   -   Php+mysql помогите пожалуйста доработать Sql запрос (http://www.flasher.ru/forum/showthread.php?t=59694)

igor82 22.06.2004 02:00

Php+mysql помогите пожалуйста доработать Sql запрос
 
Привет всем! Народ плз помогите...


Таблица table_1
Поля: id,name

ДАнные в ней:
id | name
-----------------
1 | спойлер
2 | фары


Есть у меня например критерий выборки данных:

1) SELECT table_1.* FROM table_1 WHERE table_1.name='Спойлер' AND table_1.name='Фары'

Естественно 1) вернет 0 записей


2) SELECT table_1.* FROM table_1 WHERE table_1.name='Спойлер' OR table_1.name='Фары'

А второй вариант 2) вернет две записи


А как быть например когда у меня запрос такого вида (просто для примера)

SELECT table_1.* FROM table_1 WHERE (table_1.name='Спойлер' OR table_1.name='Фары') AND (table_1.name='Спойлер' OR table_1.name='Фары')

Он вернёт тоже 0 результатов...


Все это я говорю к случаю поиска....Т.е например ползьзователь вводит в строку поиска выражение 'спойлер фары'
Для полнроценного поиска (т.е если выражение не встречается ЦЕЛИКОМ ни в одном поле) я разбиваю его на слова и уже конкретно ищу совпадения каждого слова для каждого поля (т.е как в последнесм запросе).
Таким образом если 'фары' и 'спойлер' находятся в одном ряду (колонке) то последний запрос работать не будет...
Как же тогда быть? Ведь когда запрос формируется динамически там не предусмотришь какое слово в каком поля(колонке) искать.


Приношу заранее извинения за запутанность вопроса...Надеюсь кто-нить поймет всетаки...а если нет то пожалуйста пишите - я с удовольствием объясню непонятные моменты...

kompadre 22.06.2004 02:44

Цитата:

...а если нет то пожалуйста пишите - я с удовольствием объясню непонятные моменты...
Пишу, блин ... :rolleyes:

На кого чорта тебе AND? Разбиваешь по словам и ищешь условием OR. Если ненужны дубликаты указываешь в запросе что-бы он групировался нужному тебе полю в таблице (GROUP BY).

Crazy 22.06.2004 09:51

Re: Php+mysql помогите пожалуйста доработать Sql запрос
 
Цитата:

Оригинал написал(а) igor82
Он вернёт тоже 0 результатов...
Он вернет 2 записи.

Constantine 22.06.2004 11:16

Как на счет полнотекстового поиска?
Поле name сделать полнотекстовым индексом и вперед:
SELECT id, name FROM table1 WHERE MATCH (name) AGAINST ('Спойлер Фары');
Вернет оба...

igor82 22.06.2004 14:16

Цитата:

Оригинал написал(а) kompadre


Пишу, блин ... :rolleyes:

На кого чорта тебе AND? Разбиваешь по словам и ищешь условием OR. Если ненужны дубликаты указываешь в запросе что-бы он групировался нужному тебе полю в таблице (GROUP BY).


Вот смотри....Допустим пользователь ввель в поиске это выражение 'ford спойлер фары'.....Если сделать по-твоему т.е поставить OR то БД будет искать совпадиния или для Ford или для СПОЙЛЕР или для ФАРЫ....А если у меня в БД помимо спойлеров и фар есть именно для FORDа ещё: глушители, колесные диски и т.д...Таким образом вместо того чтобы вывести форды с фарами и спойлерами - БД навыводит мне FORDов з глушителями и дисками....что недопустимо.....

Может я просто не знаю чего? Или есть какие либо специальные алгоритмы для такого поиска?

http 22.06.2004 17:55

igor82


Вопрос. Зачем писать постоянно table_1.
Например: table_1.name; table_1.*
Если можно просто name; *
Попробуй так. Легче жить будет :)

Цитата:

SELECT table_1.* FROM table_1 WHERE (table_1.name='Спойлер' OR table_1.name='Фары') AND (table_1.name='Спойлер' OR table_1.name='Фары')
Это что ещё за бред :confused:

Просто делай цикл и выбирай свои слова из БД, Но по одному :)

igor82 22.06.2004 19:23

Цитата:

Оригинал написал(а) http
igor82


Вопрос. Зачем писать постоянно table_1.
Например: table_1.name; table_1.*
Если можно просто name; *
Попробуй так. Легче жить будет :)



Это что ещё за бред :confused:

Просто делай цикл и выбирай свои слова из БД, Но по одному :)


Не понял причем тут цикл и как его сюда пределать.....Мне не нужно по одному .. Если у меня есть фраза 'ford спойлер фары' мне нужно чтобы БД нашла совпадения не для каждого слова по отдельность а для всей связки по возможность....

Т.е чтобы вывелись результаты где встречается либо FORD и СПОЙЛЕР либо FORD и ФАРЫ либо СПОЙЛЕР И ФАРЫ....а не по отдельность для фар для спойлеров и для фордов...

kompadre 22.06.2004 19:33

Послушай, а то что в прошлом топике проходили ни как не прикрутить?

к примеру
Код:

SELECT table_1.* FROM table_1 WHERE
name like '%Спойлер%' and name like '%фары%'


styx 22.06.2004 19:40

Насколько я понял, Вы хотите, сделать поиск нескольких слов (допустим, word1, word2 и word3) по нескольким колонкам? Например, field1 и field2. Тогда надо динамически формировать запрос типа

(field1 like word1 and field1 like word2 and field1 like word3)
or
(field2 like word1 and field1 like word2 and field1 like word3)
or
(field1 like word1 and field2 like word2 and field1 like word3)
or
(field2 like word1 and field2 like word2 and field1 like word3)
or
(field1 like word1 and field1 like word2 and field2 like word3)
or
(field2 like word1 and field1 like word2 and field2 like word3)
or
(field1 like word1 and field2 like word2 and field2 like word3)
or
(field2 like word1 and field2 like word2 and field2 like word3)

Только оно Вам надо? Выходов два - или действительно используете match - чего я не практикую, потому как match пока в MySQLе какой-то... не совсем зрелый... - или сделать отдельное поле, в которое складывать содержимое всех полей, по которым надо искать, и искать только в нём. Я бы выбрал второй вариант... Хотя динамическое формирование конструкций типа приведённой тоже приходилось использовать - но имейте в виду, что SQL-оптимизатору от такой конструкции грустно...

Надеюсь, что объяснил понятно :)

igor82 22.06.2004 22:27

Цитата:

Оригинал написал(а) styx
Насколько я понял, Вы хотите, сделать поиск нескольких слов (допустим, word1, word2 и word3) по нескольким колонкам? Например, field1 и field2. Тогда надо динамически формировать запрос типа

(field1 like word1 and field1 like word2 and field1 like word3)
or
(field2 like word1 and field1 like word2 and field1 like word3)
or
(field1 like word1 and field2 like word2 and field1 like word3)
or
(field2 like word1 and field2 like word2 and field1 like word3)
or
(field1 like word1 and field1 like word2 and field2 like word3)
or
(field2 like word1 and field1 like word2 and field2 like word3)
or
(field1 like word1 and field2 like word2 and field2 like word3)
or
(field2 like word1 and field2 like word2 and field2 like word3)

Только оно Вам надо? Выходов два - или действительно используете match - чего я не практикую, потому как match пока в MySQLе какой-то... не совсем зрелый... - или сделать отдельное поле, в которое складывать содержимое всех полей, по которым надо искать, и искать только в нём. Я бы выбрал второй вариант... Хотя динамическое формирование конструкций типа приведённой тоже приходилось использовать - но имейте в виду, что SQL-оптимизатору от такой конструкции грустно...

Надеюсь, что объяснил понятно :)


Просто даже не представляю как свалить все в одно поле....База данных распределенная и вней куча таблиц по которым и происходит поиск.....Попробую ваш запрос...надеюсь что сраюотает....


Часовой пояс GMT +4, время: 11:20.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.