mysql - SQL 按问题排序在数据表中无法正确显示

标签 mysql sql function

我有一个表,其中包含有关我的系统的所有用户的信息。该表中的一行名为 is_active,其中包含一个简单的字符串,表示 ACTIVE 或 INACTIVE。

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

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

代码

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();
}

到目前为止,输出未在分组内进行过滤,并且可以有一行:Active、active、inactive、inactive、active.inactive 等...

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

表结构

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 意味着不区分大小写

<小时/>

让我们把这个放在一边,在文本字段中存储二进制值(is_active = yes 或 no)...您最多使用 10B 来存储 1 位。

如果您坚持使用文本(人眼友好)列,请使用 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;

关于mysql - SQL 按问题排序在数据表中无法正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24680901/

相关文章:

mysql - 如何在 MySQL Workbench 中执行简单的 SQL 命令

mysql - 将表与第二个表中的一个已知变量连接起来

sql - Listagg 分区而不是 Group By

c++ - 如何从函数创建和返回字符串?

mysql - 空 MySQL 存储过程未编译

Mysql Concat 不为空值

sql - 如何获得 Oracle 中不同记录的最高计数?

mysql - 将值插入表中的新列,根据同一表中的数据计算

javascript - 在 JavaScript 中用 map 方法替换 for 循环

javascript - 在数组中设置多个谷歌地图坐标对象