MySQL Codeigniter - $ this-> db-> query и результаты CLI не совпадают - PullRequest
1 голос
/ 28 мая 2011

Я использую этот запрос для возврата результатов поиска

    $id = $this->auth->get_user_id();

    $query = $this->db->query("
    SELECT user_id,
           facebook_id,
           first_name,
           last_name,
           country,
           state,
           city,
           picture,
           cars_id,
           cars_name,
           cars_picture
    FROM   user_profiles
           JOIN users
             ON users.id = user_id
           JOIN cars
             ON cars.id_fk = user_id
    WHERE  user_id NOT LIKE '$id'
           AND activated = 1
           AND banned = 0
           AND first_name LIKE '%$search_term%'
            OR last_name LIKE '%$search_term%'
            OR Concat(first_name, ' ', last_name) LIKE
               '%$search_term%'            
    ORDER BY last_name ASC; 
    ");

Если я нажимаю на пустое поле поиска, возвращаются все пользователи, если я ввожу имя или фамилию, в качестве результата поиска он возвращает только этого конкретного пользователя. Используя командную строку, этот запрос дает аналогичные результаты при ручном вводе (или оставляя пустым) $id, $first_name и т. Д.

НО, вот странное поведение: кажется, что следующие строки не влияют на запрос:

user_id NOT LIKE '$id' //line 1
  AND activated = 1
  AND banned = 0

Например, я не могу исключить текущего пользователя из результатов поиска (строка 1). Независимо от того, что я введу для activated или banned, нажатие на пустой поиск всегда возвращает всех пользователей .

Кикер в том, что если я запускаю этот SQL в командной строке и вручную введите

user_id NOT LIKE '5'
   AND activated = 1
   AND banned = 0

корректно фильтрует результаты.

Кто-нибудь знает, что я делаю не так? Спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

Я думаю, что OR не привязаны к последнему AND.Попробуйте это:

AND (first_name LIKE '%$search_term%'
        OR last_name LIKE '%$search_term%'
        OR Concat(first_name, ' ', last_name) LIKE
           '%$search_term%' )     
1 голос
/ 28 мая 2011

Причина такого поведения связана со смешением AND и OR в условии и с порядком предшествующих этих двух.

Если у вас есть состояние, подобное:

WHERE a
  AND b
  AND c
  AND d
  AND e
  AND f

или как

WHERE a
   OR b
   OR c
   OR d
   OR e
   OR f

нет необходимости в скобках. Однако, если добавить скобки, результат не изменится.

Но когда у вас есть этот:

WHERE a
  AND b
  AND c
   OR d
   OR e
   OR f

(поскольку AND имеет более высокий приоритет, чем OR), оно переводится как:

WHERE ( a
       AND b
       AND c
       AND d
      )
   OR e
   OR f

, где вы можете захотеть что-то другое, например:

WHERE a
  AND b
  AND c
  AND ( d
     OR e
     OR f
      )

Итак, я думаю, вам нужно:

WHERE  user_id NOT LIKE '$id'
       AND activated = 1
       AND banned = 0
       AND ( first_name LIKE '%$search_term%'
          OR last_name LIKE '%$search_term%'
          OR Concat(first_name, ' ', last_name) LIKE
             '%$search_term%'    
           )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...