Codeigniter mysql where 不等于查询

Posted

技术标签:

【中文标题】Codeigniter mysql where 不等于查询【英文标题】:Codeigniter mysql where not equal to query 【发布时间】:2013-01-16 09:27:59 【问题描述】:

mysql codeigniter 查询无法正常工作。 假设如果 mysql 表看起来像这样:

 user_id|user_name
       1|john
       2|alex
       3|sam

这里 user_name 是唯一的

如果 user_name=johnuser_id=1true 如果说 user_name=john 和 user_id=2

$this->db->get_where('user', array('user_name' => $name,'user_id !=' => $userid));

但在 user_name=johnuser_id=1 的情况下返回 true

谁能建议我另一种查询不等于的方法。

print($this->db->last_query()) 给出:

SELECT * FROM (user) WHERE user_name = 'john' AND user_id != '1'

【问题讨论】:

您是否有其他名字为 john 的用户?这也会返回 true。 试试这个并检查执行了什么查询 print "SQL Query: ".$this->db->last_query(); 好吧,这就是 SELECT * FROM (user) WHERE user_name = 'john' AND user_id != '1' 的样子。 1 是返回的行数。 这是正确的,只有您检查 user_id!= 是否明显 user_id 不相等,它才会返回 true,因为 1 != 2 所以它会返回 true 这会帮助你[同样的问题][1] [1]:***.com/questions/5226261/… 【参考方案1】:

你为什么不使用简单的$this->db->query('your query');

【讨论】:

我建议你使用过程,因为它们是预先解析和编译的,并使用 $this->db->query('call yourprocedure('your parms')'); 我很惊讶这是公认的答案。它没有尝试解决所提出的具体问题,也绝对没有教育 OP 或未来研究人员的意图。 Stack Overflow 的价值非常低。【参考方案2】:

只需试试这个,在 where 函数中添加所需的条件。

$this -> db -> where('invitee_phone !=', $user_phone);

【讨论】:

这个完全无法解释的答案与所提出的问题没有相似之处,并且不尊重 OP 面临的实际挑战。质量很差。【参考方案3】:

您也可以按照以下方式进行。它对我有用

$total = 5;
$CI = get_instance();
$CI->load->database();
$CI->db->order_by('id','asc');
$topusers = $CI->db->get_where('users',array('user_type != 1  && `status` =' => 1),$total,0);
echo $CI ->db ->last_query();
die;

如果仍然不适合你,你可以使用@rohit 建议:$this->db->query('your query');

【讨论】:

&&your 数据库驱动程序的有效 sql 语法吗?使用 order_by 有什么意义?为什么有 5 个任意限制?为什么在查询中发明新的/未提及的表列? last_query() 不会产生结果集,它会显示呈现的查询。这个答案不是一个很好的答案。它不仅在做坏事/不必要的事情,而且没有任何解释。【参考方案4】:

类型 1:

对一列使用->where("column_name !=",$columnname) 即可。

但如果要检查多列,则必须在 where 子句中形成一个 array

这样

$whereArray = array(
                "employee_name" => $name,
                "employee_id !=" => $id,
        );

$this->db->select('*')->from('employee')->where($whereArray);

类型 2:

我们可以在 where 中准确地写出我们想要的内容。

喜欢

$thi->db->where(("employee_id =1 AND employee name != 'Gopi') OR designation_name='leader@gopis clan'");

Type 2 适用于组合查询,我的意思是 paranthesis "()"

【讨论】:

OP实际上不需要选择任何数据到结果集中;只需要计数。您没有完全接受 CI 的查询构建器方法——这会使您的建议不那么可移植。假设变量将包含在 where 值中,此技术将不稳定/不安全,因为不会自动转义。 无论如何感谢数组字符串中的 != 标记,这对我自定义 Where 语句很有帮助...@AravidhGopi【参考方案5】:

您可以按照以下代码进行操作:

$query = $this->db->select('*')->from('employee')->where('user_name', $name)->where('user_id !=', $userid)->get();
$last_query = $this->db->last_query();
$result = $query->result_array();

如果您传递 $name = 'john' 和 $userid = '1' 则返回空数组。

【讨论】:

我不仅相信这个答案的 where 逻辑不正确,OP 实际上不需要从查询中生成数据结果集。只需要计数。这比它需要做的更多,还有更简洁的方法可以使用。【参考方案6】:

使用$this->db->query('your query'); 的问题在于它不可移植。采用查询构建器方法的最重要原因之一是,无论您使用什么数据库驱动程序,CodeIgniter 都能确保语法正确。

如果可以进行一些讨论,我可能想听听为什么您的表中需要复合主标识符,并且我想看看您的表架构是什么样的。但是,我认为讨论的时间已经过去了。

实际上,您希望返回一个布尔结果,说明用户名和 id 组合的可用性——如果一个匹配,但不是两者都匹配,则 true(可用)。

要实现这一点,您需要在表中搜索具有两个限定条件的完全匹配的行,计算行数,将该整数转换为布尔值,然后返回相反的值(语法比解释简单)。

考虑一下这种干净、直接、便携的单线。

return !$this->db->where(['user_name' => $name,'user_id' => $userid])->count_all_results('user');

如果计数为> 0,则返回false,如果计数为0,则返回true

【讨论】:

以上是关于Codeigniter mysql where 不等于查询的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter:如何使用 WHERE 子句和 OR 子句

带有Codeigniter中If条件的MySQL get_where

Codeigniter模型中的Mysql日期格式

mysql utcdate 字符串比较codeigniter

从表中选择或在 codeigniter 中的 where 和运算符中选择

Codeigniter - 具有多个 Where 条件的批量更新