Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск строк со вхождением части строки, Алгоритм поиска 
V
    Опции темы
DeamonShan
Дата 11.5.2011, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



Всем привет!

У меня такая проблема:

Есть таблица товаров. в таблице поле filtеr отвечает за поиск, то есть товар ищется по критериям, записанных в поле filtеr, например есть запись:

table:tovar

id | name       | filter
----------------------------
1  | Tovar #1 | 2,6,4

значения поля filter через запятую означают id таблицы фитров:

table:filter

id | name 
-----------------------------
1  | DDR1
2  | DDR3
4  | CPU Core 2 Duo
5  | HDD 25Gb
6  | HDD 500Gb

таким образом товар с ID=1 со значением filter=2,6,4 есть товар, с критериями DDR3 и HDD 500Gb и CPU Core 2 Duo.

Такой вопрос: Как сделать выборку по фильтру, если я в поиске указал критерии DDR3 [и HDD 500Gb [и CPU Core 2 Duo]]?

Подскажите, пожалуйста, как составить такой запрос. А если есть другой алгоритм и нужно перестроить таблицы, тоже буду рад выслушать Вас
PM MAIL   Вверх
patap
Дата 11.5.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 3
Всего: 40



нужно перестроить таблицы
добавь связную таблицу tovar_has_filter к примеру, чтобы она реализовывала связь многие-ко-многим между таблицами tovar и filter

[tovar]
ID_tovar
name

[filter]
ID_filter
name

[tovar_has_filter]
ID_tovar
ID_filter



--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
ksnk
Дата 11.5.2011, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(DeamonShan @  11.5.2011,  08:46 Найти цитируемый пост)
А если есть другой алгоритм и нужно перестроить таблицы

Ну, дык! Понятно, что реляционные базы и "значения индексов через запятую" не очень-то связаны друг с другом.
Можно посоветовать поле фильтр трансформировать в таблицу
{id_товара, id_фильтра}, при этом товару  Tovar #1 будет соответствовать 3 строчки таблицы. Тогда и запрос будет выглядеть более реляционным...

а так - можно использовать строковые операции в mysql

критерий поиска по фильтру 2 будет выглядеть как-то так
Код

... where not INSTR(',2,',CONCAT(',',`filter`,','))=0

Правда надеятся на производительность с большой таблицей, наверное, не придется ;)

Можно обрамить запятыми значение поля filter прямо в таблице, чтобы не напрягать этим запрос...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
DeamonShan
Дата 11.5.2011, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



patap, я вашим советом воспользуюсь... как тогда в таком случае составить запрос?

Добавлено через 7 минут и 32 секунды
ksnk, да, таблица огромная будет, поэтому думаю стоит завесит третью таблицу...
PM MAIL   Вверх
patap
Дата 11.5.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 3
Всего: 40



ну я бы так сделал

если нужно вернуть только товар, без фильтров
Код

SELECT DISTINCT tovar.*
FROM tovar, filter, tovar_has_filter
WHERE (filter.name = 'filter name 1' OR filter.name = 'filter name 2') AND filter.ID_filter = tovar_has_filter.ID_filter AND tovar.ID_tovar = tovar_has_filter.ID_tovar


либо, если нужно вывести еще и филтры, тогда так. Потом на стороне пхп привести результат к нормальному виду
Код

SELECT tovar.*, filter.name AS filter_name
FROM tovar, filter, tovar_has_filter
WHERE (filter.name = 'filter name 1' OR filter.name = 'filter name 2') AND filter.ID_filter = tovar_has_filter.ID_filter AND tovar.ID_tovar = tovar_has_filter.ID_tovar


условие по фильтрам подгони под свои нужды (LIKE если нужно)

Это сообщение отредактировал(а) patap - 11.5.2011, 10:32


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
DeamonShan
Дата 11.5.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



Код

WHERE (filter.name = 'filter name 1' OR filter.name = 'filter name 2') AND


не совсем понял вот этот момент... на входе известны только ID фильтров...
PM MAIL   Вверх
patap
Дата 11.5.2011, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 3
Всего: 40



а, ну тогда там нужно заменить name на ID_filter

Код

(filter.ID_filter = 1 OR filter.ID_filter = 2)


или так
Код

filter.ID_filter IN (1,2,3) AND ...



--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
CruorVult
Дата 11.5.2011, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: 1
Всего: 28



Цитата(patap @  11.5.2011,  10:31 Найти цитируемый пост)
filter.name = 'filter name 1'

только искать нужно не по именам фильтра а не по айди а то мускуль загнется  smile 



Это сообщение отредактировал(а) CruorVult - 11.5.2011, 10:52
PM MAIL Skype   Вверх
DeamonShan
Дата 11.5.2011, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



то есть то что в скобках, нужно построить по средством PHP и составить запрос?
PM MAIL   Вверх
CruorVult
Дата 11.5.2011, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: 1
Всего: 28



а, ну уже разобрались)
PM MAIL Skype   Вверх
patap
Дата 11.5.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 3
Всего: 40



Цитата(DeamonShan @  11.5.2011,  09:51 Найти цитируемый пост)
то есть то что в скобках, нужно построить по средством PHP и составить запрос? 

да, 

Код

$ids = '1,2,3'; // формируешь подобную строка и запихываешь в запрос

"filter.ID_filter IN ($ids) AND filter.ID_filter = tovar_has_filter.ID_filter AND tovar.ID_tovar = tovar_has_filter.ID_tovar"



--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
DeamonShan
Дата 11.5.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



огромное спасибо.... +
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.