我想在mysql中查询数据,如:
$cid=$_POST["cid"];
$room_id=$_POST["room_id"];
$time=$_POST["time"];
$reuslt=$this->db-query("SELECT * FROM mytable WHERE if($cid is not null){then check cid=$cid} else{don't check} AND if($room_id is not null){then check room_id=$room_id} else{don't check} AND if($time is not null){then check time=$time} else{don't check}");
如何编写正确的sql来查询数据?
答案 0 :(得分:1)
因此,如果您想使用SQL if | else语句,请查看Using an IF Statement in a MySQL SELECT query或If else on WHERE clause之类的内容。
其他一些sql答案看起来也很有趣。但是我会警告不要过度复杂。
对于这个OP,它更容易准备发送给DB的语句,而不是过度思考它,并且如果大量数据集和不良索引,风险性能会下降。
所以,如果这与php if | else更相关,并且你想将它保持为单行(而不是在多个语句上连接一个字符串),我会推荐三元语法
https://davidwalsh.name/php-shorthand-if-else-ternary-operators
例如,这样的事情应该有效:
$reuslt= $this->db-query("SELECT * FROM mytable WHERE TRUE "
. ( ($cid is not null) ? " AND cid='".$cid."'" : "" )
. ( ($room_id != null) ? " AND room_id='".$room_id."'" : "" )
. ( ($time != null) ? " AND time='" . $time . "'" : "" );
WHERE TRUE只是为了更容易打印,尽管创建$ sql字符串变量并在单独的if()语句上准备语句真的会更容易。
虽然我也强调需要转义这些值,就像你应该对所有用户输入一样。
答案 1 :(得分:1)
您可以在1=1
子句中的IF
函数中使用WHERE
作为占位符:
$query = "SELECT * FROM mytable
WHERE IF('$cid' != '', cid='$cid', 1=1)
AND IF('$room_id' != '', room_id='$room_id', 1=1)
AND IF('$time' != '', time='$time', 1=1)"
$result=$this->db->query($query);
我不知道你的框架是如何处理它的,但是这段代码很容易受到SQL注入的攻击,你应该使用带参数化的准备好的查询。
答案 2 :(得分:0)
下面的SQL语句将执行您要执行的操作:
SELECT * FROM mytable WHERE (('$cid' is not null) AND (cid='$cid'))
AND (('$room_id' is not null)AND(room_id='$room_id'))
AND (('$time' is not null) AND (time='$time'))
答案 3 :(得分:0)
您可以通过case
声明:
SELECT *
FROM mytable
WHERE
(cid = case when $cid is not null then $cid else cid end) AND
(room_id = case when $room_id is not null then $room_id else room_id end) AND
(time = case when $time is not null then $time else time end)
答案 4 :(得分:0)
这就是我在我的案例及其工作中的表现。()在模型中
public function get($table,$column='*',$where='',$start='',$limit='',$seach_field='', $seach_keyword='', $seach_type='',$orderby='',$order_type='DESC')
{
$this->db->select($column);
$this->db->from($table);
if($where !='')
{
$this->db->where($where);
}
if($seach_field !='' && $seach_keyword !='' && $seach_type!='')
{
$this -> db -> like($seach_field, $seach_keyword, $seach_type);
}
if($orderby!='')
{
$this->db->order_by($orderby,$order_type);
}
if($limit!='')
{
$this->db->limit($limit, $start);
}
$que = $this->db->get();
return $que->result_array();
}