【问题标题】:MySql get list of pages by user_id or if user_id is not defined get all pagesMySql 通过 user_id 获取页面列表,或者如果未定义 user_id 获取所有页面
【发布时间】:2020-08-18 19:20:44
【问题描述】:

我想从我的 MySQL 表中获取页面列表。但是,如果 $user_id 值为 NULL 并且如果定义了 $user_id 值,我想获取所有用户添加的页面列表,我需要获取该特定用户添加的页面列表。我觉得可能有一个简单的解决方案,但我长期以来一直试图为这种情况找到解决方案,但我用诸如“WHERE user_id is 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 是否为空并在执行 MySQL 查询之前更改查询?根据您的数据库的大小,我建议您检查您在 where 子句中使用的字段是否有足够的索引,以确保它是快速的。只需确保您的 MySQL 列中没有 >40% 的索引。您可能还想限制 MySQL 查询和分页。

标签: php mysql sql where-clause


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以在 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

    【讨论】:

    • 我个人会使用 === null 而不是 is_null 因为它更快。但是,不建议仅对 % 使用 LIKE 查询,因为即使该字段上有索引也会触发全表扫描,因为它将检查与通配符匹配的每一行(所有内容)然后它将返回所有结果。最好只删除 where 语句。
    • 关于get a list of pages added by all users的问题你已经在评论中指出了
    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多