Фасетный поиск в Coldfusion и SQL? - PullRequest
0 голосов
/ 18 августа 2010

Я работаю над многогранным поиском в Coldfusion и SQL.Я попытался создать запрос, подобный этому:

SELECT * FROM Turbos 
WHERE
  PartNumber LIKE '%#trim(SearchCriteria)#%' 
  OR PartDescription LIKE '%#trim(SearchCriteria)#%' 
  AND (PumpingSpeed BETWEEN #minimum# AND #URL.speed#) 
  AND InletFlange LIKE '#URL.inlet#' 
  AND Bearing LIKE '#URL.bearing#' 
  AND Condition LIKE '#URL.condition#'

Проблема в том, что сервер возвращает строки, которые не содержат КАЖДУЮ часть данных, которые я предоставляю.Как выбрать ТОЛЬКО те строки, которые содержат все критерии?

Ответы [ 4 ]

5 голосов
/ 19 августа 2010

просто оберните бит OR в скобках:

(PartNumber LIKE '%#trim(SearchCriteria)#%' OR PartDescription LIKE '%#trim(SearchCriteria)#%') AND...

на данный момент у вас есть A или B и C, которые читаются как A или (B и C). Вы хотите (A или B) и C.

И убедитесь, что вы используете cfqueryparam, как предложено выше.

0 голосов
/ 21 августа 2010

Хотя это не ответ на ваш вопрос - вы можете рассмотреть возможность использования специального поискового решения, такого как Solr (которое входит в комплект CF9). Это более мощное полнотекстовое решение, чем простой SQL, и включает в себя огранку

0 голосов
/ 19 августа 2010

Хорошо, я нашел ответы:

Ли : +1 к разъяснению вопроса.(Маловероятно, что это имеет какое-либо отношение к результатам, но какой смысл использовать LIKE без подстановочных знаков "%"? Если вам нужно сравнение на равенство, просто используйте equals, т.е. ... AND Condition = '#URL.условие # ')

Вы были совершенно правы, я пропускал символы процента в моих сравнениях LIKE (DUH!).Я убрал их раньше, думая, что они были проблемой, но это не так:

Aiden: просто заключите бит OR в скобки:

(PartNumber LIKE '%#trim(SearchCriteria)#%' OR PartDescription LIKE '%#trim(SearchCriteria)#%') AND...

Спасибо, Эйден!

0 голосов
/ 18 августа 2010

Просто на самом деле предположение, но изменение

... '% # trim (SearchCriteria) #%' ИЛИ PartDescription ...

до

... '% # trim (SearchCriteria) #%' AND PartDescription ...

редактировать
или вы говорите, что некоторые имеют нулевые значения?

редактировать комментарий
Представьте себе, например, что InletFlange пусто для вашей части, и пользователь не включил его в свой поиск.
Тогда InletFlange LIKE '#URL.inlet#' будет сравнивать "" LIKE "", что, конечно, верно, поэтому продукт появляется.

Есть много способов решить эту проблему. Например

  1. По умолчанию для критерия поиска установлено значение "N / A" или что-то еще
  2. По умолчанию столбец в базе данных аналогичным образом.
  3. что-то вроде AND NOT ISNULL(InletFlange,'')=='' для каждого критерия
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...