Другой порядок аргументов для LIKE изменений результатов - PullRequest
0 голосов
/ 06 марта 2019

У меня очень странная ситуация в MySQL (MariaDB). У меня есть запрос с:

  • два keywords
  • один location
  • один salary
  • один limit

Если keywords аргументы расположены в другом порядке, я получаю разные результаты:

Запрос № 1:

bindings: [ '%Javascript%', '%Vue.js%', 'Krakow', '3000', 15 ],
sql:
   'select `jobs`.*,`companies`.`name`as `company_name`, 
            `companies`.`logo` as `company_logo`, `projects`.`staff`, 
            `projects`.`breakdown`, `projects`.`methodology`, 
            `projects`.`stack`, `projects`.`perks` 
    from `jobs` 
        inner join `companies` on `jobs`.`company_id` = `companies`.`id` 
        inner join `projects` on `jobs`.`project_id` = `projects`.`id` 
    where `keywords` like ? 
       or `keywords` like ? 
       and `location` = ? 
       and `salary_min` >= ? 
    order by `jobs`.`salary_min` desc 
    limit ?' }
count:  45

Запрос № 2:

bindings: [ '%Vue.js%', '%Javascript%', 'Krakow', '3000', 15 ],
sql:
   'select `jobs`.*, `companies`.`name`as `company_name`, 
            `companies`.`logo` as `company_logo`, `projects`.`staff`, 
            `projects`.`breakdown`, `projects`.`methodology`, 
            `projects`.`stack`, `projects`.`perks` 
    from `jobs` 
        inner join `companies` on `jobs`.`company_id` = `companies`.`id` 
        inner join `projects` on `jobs`.`project_id` = `projects`.`id` 
    where `keywords` like ? 
       or `keywords` like ? 
      and `location` = ? 
      and `salary_min` >= ? 
    order by `jobs`.`salary_min` desc 
    limit ?' }
count:  6

Проблемы: - почему он не возвращает работу только из выбранных location? - почему разница в счете из-за keywords заказа?

Хотелось бы понять это - не могу обернуть голову вокруг этого. Я использую Knex для выполнения этих запросов.

1 Ответ

1 голос
/ 06 марта 2019

AND имеет более высокий приоритет, чем OR.Поставьте скобку вокруг вашего заявления OR.https://docs.microsoft.com/en-us/sql/t-sql/language-elements/operator-precedence-transact-sql?view=sql-server-2017

select `jobs`.*, `companies`.`name`as `company_name`, 
        `companies`.`logo` as `company_logo`, `projects`.`staff`, 
        `projects`.`breakdown`, `projects`.`methodology`, 
        `projects`.`stack`, `projects`.`perks` 
from `jobs` 
    inner join `companies` on `jobs`.`company_id` = `companies`.`id` 
    inner join `projects` on `jobs`.`project_id` = `projects`.`id` 
where (`keywords` like ? 
   or `keywords` like ?) 
  and `location` = ? 
  and `salary_min` >= ? 
order by `jobs`.`salary_min` desc 
limit ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...