有没有更好的方法来做排序选项?

Is there any better way to do sorting option?

所以,我正在尝试创建一个选项来对数据库中的结果进行排序。我找到了一种方法来做到这一点,但我不确定它是最好的。

if(!isset($_GET['sort']) || $_GET['sort'] == 0) {
    $userquery = $DBH->query("SELECT users.id, users.username, users.name, users.joined, users.usergroup, user_groups.group_title FROM users INNER JOIN user_groups ON users.usergroup = user_groups.id ORDER BY users.id ASC");
    $userquery->setFetchMode(PDO::FETCH_OBJ);
} else {
    if($_GET['sort'] == 1) {
        $userquery = $DBH->query("SELECT users.id, users.username, users.name, users.joined, users.usergroup, user_groups.group_title FROM users INNER JOIN user_groups ON users.usergroup = user_groups.id ORDER BY users.username ASC");
        $userquery->setFetchMode(PDO::FETCH_OBJ);
    } else if($_GET['sort'] == 2) {
        $userquery = $DBH->query("SELECT users.id, users.username, users.name, users.joined, users.usergroup, user_groups.group_title FROM users INNER JOIN user_groups ON users.usergroup = user_groups.id ORDER BY users.name ASC");
        $userquery->setFetchMode(PDO::FETCH_OBJ);
    } else if($_GET['sort'] == 3) {
        $userquery = $DBH->query("SELECT users.id, users.username, users.name, users.joined, users.usergroup, user_groups.group_title FROM users INNER JOIN user_groups ON users.usergroup = user_groups.id ORDER BY user_groups.group_name ASC");
        $userquery->setFetchMode(PDO::FETCH_OBJ);
    }
}

有更好的方法吗?

无需一遍又一遍地重复查询的 non-changing 部分。只需将其放入变量并根据条件将 ORDER BY 子句附加到该字符串即可。然后使用字符串作为查询参数。

$querystring = "SELECT users.id, users.username, users.name, users.joined, users.usergroup, user_groups.group_title FROM users INNER JOIN user_groups ON users.usergroup = user_groups.id ORDER BY ";
switch($_GET['sort']) {
  case 1:
  $querystring.= "users.username ASC";
    break;
  case 2:
  $querystring.= "users.name ASC";
    break;
  case 3:
  $querystring.= "user_groups.group_name ASC";
    break;
case 0:
default:
  $querystring.= "users.id ASC";
    break;
}

$userquery = $DBH->query($querystring);
$userquery->setFetchMode(PDO::FETCH_OBJ);