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

问题描述

我想从我的MysqL表中获取页面列表。但是,如果$ user_id值为NULL,并且如果定义了$ user_id值,我想获取所有用户添加页面列表,我需要获取特定用户添加页面列表。我觉得可能有一个简单的解决方案,但是很长时间以来我一直试图找到一种解决方案,但是我失败了,例如“ WHERE user_id不为null或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();
}

解决方法

您可以在LIKE中使用通配符

正如Liam Sorsby正确指出的那样,所有页面可能都是很多页面,因此您应该考虑过时或限制行数

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 |     id
-: | -----:
 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 提琴here

,

如果$ 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