我有一个表,其中包含有关所有系统用户的信息。该表中的一行名为is_active,其中包含一个简单的字符串,指明“活动”或“不活动”。

我正在建立一个面板,管理员可以在其中列出所有用户的所有信息。数据表库正在显示此信息。我希望数据表首先显示所有活动的用户,然后再显示不活动的用户。

不幸的是,我的查询没有正确返回信息。



public function get_all_users(){
    $query = $this->db->prepare("SELECT * FROM users ORDER BY is_active DESC");

    try{
        $query->execute();
    }catch(PDOException $e){
        die($e->getMessage());
    }
    return $query->fetchAll();
}


截至目前,输出未在分组中进行过滤,并且可以包含以下行:活动,活动,非活动,非活动,活动,非活动等。

我认为这应该与datatables插件无关,而是与我的查询无关。有人可以帮忙吗?提前致谢!

表结构

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `firstname` varchar(30) NOT NULL,
  `lastname` varchar(30) NOT NULL,
  `direct_phone` varchar(21) NOT NULL,
  `ext_num` smallint(4) NOT NULL,
  `cellphone` varchar(10) NOT NULL,
  `num_loads_booked` int(11) unsigned NOT NULL,
  `email` varchar(255) NOT NULL,
  `security_level` varchar(20) NOT NULL,
  `username` varchar(10) NOT NULL,
  `password` varchar(64) NOT NULL,
  `is_active` varchar(10) NOT NULL,
  `last_logged_in` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ;

最佳答案

我的猜测是您打开了case sensitive排序规则,并使用了不同的大小写(activeACTIVE,...)作为is_active值。尝试运行:

SELECT 'a' > 'A', 'a' < 'A', 'a' = 'A';


如果得到(1,0,0),则正在运行区分大小写的排序规则,并且如果(0,0,1)不区分大小写,请检查:

SHOW VARIABLES LIKE 'collation%';


对我来说,utf8_general_ci-> _ci表示case insensitive



暂且不说,在文本字段中存储二进制值(is_active = yes或no)...您正在使用最多10B的空间来存储1位。

如果您坚持使用text(人眼友好)列,请使用ENUM('active', 'inactive')(枚举在内部由数字表示,因此查找速度更快)。

甚至更好地使用BOOL(这是TINYINT(1)的别名)。比您必须使用:

print(row->GetInt("is_active") ? 'ACTIVE' : 'INACTIVE')
// Instead of
print(row->GetString("is_active"))


稍长一点,但是在求值表达式等等时更快:

if( user->is_active)
// Instead of
if( user->is_active == "active")


为您进行迁移也应该很容易:

ALTER TABLE users CHANGE is_active _is_active VARCHAR(10) NOT NULL;
ALTER TABLE users ADD is_active BOOL DEFAULT 0 BEFORE _is_active;
UPDATE users SET is_active = (
    CONVERT(_is_active USING latin1) COLLATE latin1_swedish_ci = 'active'
);
-- Check results here
ALTER TABLE users DROP COLUMNS _is_active;

09-10 05:18
查看更多