我有一个表,其中包含有关所有系统用户的信息。该表中的一行名为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排序规则,并使用了不同的大小写(active
,ACTIVE
,...)作为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;