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=john 和 user_id=1 和 true 如果说 user_name=john 和 user_id=2。
$this->db->get_where('user', array('user_name' => $name,'user_id !=' => $userid));
但在 user_name=john 和 user_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
mysql utcdate 字符串比较codeigniter