MySql 按user_id获取页面列表,如果未定义user_id则获取所有页面



我想从我的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<>在这里小提琴

最新更新