我想从我的MySQL表中获取页面列表。但是,如果 $user_id 值为 NULL,并且定义了 $user_id 值,我想获取所有用户添加的页面列表,我需要获取该特定用户添加的页面列表。我觉得可能有一个简单的解决方案,但是我已经尝试为这种情况找到解决方案很长时间了,但是诸如"WHERE user_id NOT NULL OR user_id = $user_id"之类的方法失败了。我需要如何修改以下代码以获得预期的结果?
public function getPagesList($user_id = NULL){
$this->db->query ('
SELECT `page_id`, `page_name`
FROM `pages`
WHERE `user_id` = :user_id
');
$this->db->bind(':user_id', $user_id);
return $this->db->resultSet();
}
$user_id 值为 NULL,并且定义了 $user_id 值,我想获取所有用户添加的页面列表,我需要获取该特定用户添加的页面列表。
这将翻译为:
WHERE :user_id is NULL OR user_id = :user_id
当参数null
时,这将返回所有行;当设置参数时,它用于过滤列user_id
。
您可以使用coalesce()
稍微缩短表达式,但效率可能较低:
WHERE COALESCE(:user_id, user_id) = user_id
请注意,正如 Liam Sorsby 所评论的那样,最有效的选项可能是检查参数是否从应用程序中设置,并相应地修改查询字符串。如果未设置参数,则查询没有WHERE
子句;如果已设置,则WHERE user_id = :user_id
.
您可以使用带有 LIKE 的通配符
正如利亚姆·索斯比(Liam Sorsby)正确指出的那样,所有页面都可能是很多页面,因此您应该考虑使用pagonation或限制行数
public function getPagesList($user_id = NULL){
$uid = is_null($user_id) ? '%' : $user_id;
$this->db->query ('
SELECT `page_id`, `page_name`
FROM `pages`
WHERE `user_id` LIKE :user_id
');
$this->db->bind(':user_id', $uid);
return $this->db->resultSet();
}
这是这样工作的
create table numericstring ( pk INT auto_INCREMENT PRIMARY KEY , id INT );
insert into numericstring (id) values ( 20001 ) ,( 20002 ) ,( 30001 ) ,( 30002 ) ,( 30003 ) ,( 30004 ) ,( 37 ) ,( 937 ) ,( 21 ) ,( 3 ) ,( 222222 ) ,( 3333 ) ;
select * from numericstring WHERE id LIKE '3'
PK | ID -: |-: 10 | 3
select * from numericstring WHERE id LIKE 3
PK | ID -: |-: 10 | 3
select * from numericstring WHERE id LIKE '%'
PK | 编号 -: |-----: 1 | 20001 2 | 20002 3 | 30001 4 | 30002 5 | 30003 6 | 30004 7 | 37 8 | 937 9 | 21 10 | 3 11 |222222 12 | 3333
db<>在这里小提琴