【问题标题】:MySQL Codeigniter - $this->db->query and CLI results do not matchMySQL Codeigniter - $this->db->query 和 CLI 结果不匹配
【发布时间】:2011-05-28 13:17:45
【问题描述】:

我正在使用此查询返回搜索结果

    $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 行)。 无论我为activatedbanned 输入什么,单击空白搜索总是返回所有用户

关键是如果我在命令行上运行这个 SQL 并手动输入

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

它会正确过滤结果。

有谁知道我做错了什么?感谢您的帮助!

【问题讨论】:

    标签: php mysql codeigniter activerecord


    【解决方案1】:

    我认为 OR 不绑定到最后一个 AND。试试这个:

    AND (first_name LIKE '%$search_term%'
            OR last_name LIKE '%$search_term%'
            OR Concat(first_name, ' ', last_name) LIKE
               '%$search_term%' )     
    

    【讨论】:

    • @torr: thnx,但实际上@Christopher 比我早 26 秒回答了 :)
    【解决方案2】:

    这种行为的原因与在一个条件中混合ANDOR 以及这两者的优先顺序有关。

    当您遇到以下情况时:

    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%'    
               )
    

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 2017-04-10
      • 2012-07-23
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2018-02-02
      • 2011-10-20
      相关资源
      最近更新 更多