MySQL LIKE оператор, возвращающий странные результаты - PullRequest
0 голосов
/ 12 мая 2019

Когда я выполняю запрос LIKE MySQL с несколькими столбцами, используя AND и OR, мой фильтр приводит к тому, что запрос, например, по цене 0 и 50000, перестает работать.Если я уберу OR из моего оператора LIKE, поиск будет работать нормально.Как правильно выполнить поиск по нескольким столбцам с помощью оператора LIKE?

Вот пример нерабочего оператора, в котором Price игнорируется

SELECT * 
  FROM table 
 WHERE Price BETWEEN 0 AND 500000 
   AND class_id = 1 
   AND TotalSqFt BETWEEN 0 AND 999999999 
   AND Acres BETWEEN 0 AND 999999999 
   AND InclusionsFeatures LIKE '%horse%' 
    OR Remarks LIKE '%horse%' 
ORDER 
    BY Price DESC

Этот оператор работает правильно, но теперь я могу только выполнитьНРАВИТСЯ запрос на один столбец.

SELECT * FROM table WHERE Price BETWEEN 0 AND 500000 AND class_id = 1 AND TotalSqFt BETWEEN 0 AND 999999999 AND Acres BETWEEN 0 AND 999999999 AND InclusionsFeatures LIKE '%horse%' ORDER BY Price DESC

Ответы [ 2 ]

4 голосов
/ 12 мая 2019

В первом операторе, когда вы добавляете OR сразу после последнего AND, Mysql проходит до тех пор, пока не запустится OR.Если условие ИЛИ выполнено, Все до И игнорируютТаким образом, запрос не выполняется правильно.

Посмотрите на этот запрос:

SELECT
    * 
FROM
TABLE 
WHERE
    Price BETWEEN 0 
    AND 500000 
    AND class_id = 1 
    AND TotalSqFt BETWEEN 0 
    AND 999999999 
    AND Acres BETWEEN 0 
    AND 999999999 
    AND (InclusionsFeatures LIKE '%horse%' OR Remarks LIKE '%horse%' ) 
ORDER BY
    Price DESC

, сгруппировав ваши LIKES по скобкам, он проверяет условия внутри скобок со всеми другими условиями с помощью AND.Поэтому запрос возвращает данные, которые соответствуют условиям внутри скобок и всем остальным условиям.

0 голосов
/ 12 мая 2019

Вы смешали операторы AND и OR. Таким образом, вы можете приложить условия правильно будут работать. Для вашего условия OR вы можете приложить следующее:

SELECT * 
FROM table 
WHERE (Price BETWEEN 0 AND 500000) AND 
      (class_id = 1) AND 
      (TotalSqFt BETWEEN 0 AND 999999999) AND 
      (Acres BETWEEN 0 AND 999999999) AND 
      (
       (InclusionsFeatures LIKE '%horse%') OR (Remarks LIKE '%horse%')
      )
ORDER BY Price DESC
...