1. Mệnh đề ORDER BY là gì?

Mệnh đề ORDER BY là một mệnh đề có thể kết hợp với câu lệnh SELECT để xem dữ liệu từ một bảng lệnh của một lĩnh vực cụ thể. Nó giúp bạn xác định tên trường để sắp xếp lại và chỉ đạo xắp xếp tăng dần hoặc giảm dần. Một số cơ sở dữ liệu sắp xếp các kết quả truy vấn theo thứ tự tăng dần theo mặc định. Lệnh ASC được sử dụng để sắp xếp tăng dần và DESC được sử dụng để sắp xếp giảm dần.

Nói tóm lại một cách dễ hiểu hơn thì mệnh đề này dùng để sắp xếp. Khi bạn chọn các hàng, MySQL Server tự do trả về chúng trong bất kỳ thứ tự nào, trừ khi bạn chỉ thị cho nó cách sắp xếp kết quả. Bạn có thể sắp xếp một tập kết quả bởi việc thêm một mệnh đề ORDER BY mà xác định rõ các hàng hoặc các cột bạn muốn sắp xếp.

2. Cú pháp mệnh đề ORDER BY

Cú pháp cơ bản của mệnh đề ORDER BY:

SELECT truong1, truong2,...truongN FROM ten_bang
ORDER BY truong1, [truong2...] [ASC [DESC]]

Bạn có thể sắp xếp kết quả trả về trên bất kỳ trường nào và có thể sắp xếp kết quả trên nhiều hơn một trường. Ta cũng có thể sử dụng từ khóa ASC hoặc DESC để nhận kết quả theo thứ tự tăng dần hoặc giảm dần. Theo mặc định, thứ tự là tăng dần. Và ta sử dụng mệnh đề WHERE…LIKE theo cách thông thường để xác định điều kiện.

Ví dụ: ở đây mình sẽ đưa ra ví dụ về mệnh đề ORDER BY trong MySQL:

Ta có một bảng Nhân viên như sau:

ID Name Age Address Salary
1 Thành 17 Hà Nội 4000$
2 Nam 21 Đà Nẵng 6400$
3 Sơn 18 Cà Mau 3200$
4 Hòa 20 Phúc Thọ 5000$

Ta sẽ có:

Để sắp xếp kết quả theo thứ tự tăng dần bởi các trường NAME và SALARY, ta sử dụng câu lệnh sau:

SELECT * FROM CUSTOMERS
   ORDER BY NAME, SALARY;

Để sắp xếp kết quả theo thứ tự giảm dần bởi trường NAME, ta sử dụng câu lệnh sau:

SELECT * FROM CUSTOMERS
   ORDER BY NAME DESC;

Để sắp xếp các hàng với thứ tự ưu tiên của riêng mình, câu lệnh sau sắp xếp kết quả theo thứ tự tăng dần của trường ADDRESS và theo thứ tự giảm dần của trường SALARY:

SELECT * FROM CUSTOMERS
   ORDER BY (CASE ADDRESS
   WHEN 'Ha Noi'   THEN 1
   WHEN 'Da Nang'   THEN 2
   ELSE 10 END) ASC, ADDRESS DESC;

Các bạn có thể chạy thử và xem bảng của mình nhé!

3. Sử dụng mệnh đề ORDER BY với MySQLi

Ta sẽ thực hiện một truy vấn SQL bằng cách sử dụng mệnh đề ORDER BY trong lệnh SELECT, sau đó chúng ta sẽ thực hiện truy vấn này thông qua việc chuyển nó đến hàm mysqli_query() để lấy dữ liệu theo thứ tự. Hãy xem xét bảng persons sau bên trong cơ sở dữ liệu db_lttd :

Id First_name Last_name Email
1 Thành Nguyễn Thanh@gmail.com
2 Nam Chu Nam@gmail.com
3 Sơn Phùng Son@gmail.com
4 Lập trình Từ đầu Laptrinhtudau.com

3.1. Sử dụng ORDER BY theo phương pháp MySQLi hướng thủ tục

<?php
/* Cố gắng kết nối với MySQL Server. Giả sử bạn đang chạy MySQL Server với tài khoản mặc định (user là root và không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "db_lttd");
 // Kiểm tra kết nối
if($link === false){
    die("ERROR: Không thể kết nối. " . mysqli_connect_error());
} 
// Cố gắng thực thi truy vấn với mệnh đề ORDER BY
// Mặc định sắp xếp theo thứ tự tăng dần
$sql = "SELECT * FROM persons ORDER BY first_name";
if($result = mysqli_query($link, $sql)){
    if(mysqli_num_rows($result) > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = mysqli_fetch_array($result)){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ của biến
        mysqli_free_result($result);
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} else{
    echo "ERROR: Không thể thực thi $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>

3.2. Sử dụng ORDER BY theo phương pháp MySQLi hướng đối tượng

<?php
/* Cố gắng kết nối với MySQL Server. Giả sử bạn đang chạy MySQL Server với tài khoản mặc định (user là root và không có mật khẩu) */
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
    die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Cố gắng thực thi truy vấn với mệnh đề ORDER BY
// Mặc định sắp xếp theo thứ tự tăng dần
$sql = "SELECT * FROM persons ORDER BY firts_name";
if($result = $mysqli->query($sql)){
    if($result->num_rows > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = $result->fetch_array()){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ của biến
        $result->free();
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} else{
    echo "ERROR: Không thể thực thi $sql. " . $mysqli->error;
}
// Đóng kết nối
$mysqli->close();
?>

Đầu tiên, chúng ta thiết lập truy vấn SQL chọn các cột id, họ và tên từ bảng. Các bản ghi sẽ được sắp xếp theo cột họ. Dòng mã tiếp theo chạy truy vấn và đặt dữ liệu kết quả vào một biến được gọi là $result. Sau đó, function num_rows() sẽ kiểm tra nếu có nhiều hơn 0 hàng được trả về. Nếu có nhiều hơn 0 hàng được trả về, hàm fetch_assoc() sẽ đặt tất cả kết quả vào một mảng kết hợp mà chúng ta có thể lặp lại. Các vòng lặp while() qua tập hợp kết quả và kết quả đầu ra dữ liệu từ các id, firstname và lastname cột.

4. Sử dụng ORDER BY với PDO

<?php
/* Cố gắng kết nối với MySQL Server. Giả sử bạn đang chạy MySQL Server với tài khoản mặc định (user là root và không có mật khẩu) */
try{
    $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
    // Thiết lập PDO error thành ngoại lệ
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi truy vấn
try{
    $sql = "SELECT * FROM persons ORDER BY first_name";
    $result = $pdo->query($sql);
    if($result->rowCount() > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = $result->fetch()){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ biến
        unset($result);
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} catch(PDOException $e){
    die("ERROR: Không thể thực thi $sql. " . $e->getMessage());
}
// Close connection
unset($pdo);
?>