Trong SQL, mệnh đề ORDER BY được sử dụng để sắp xếp kết quả của truy vấn theo thứ tự tăng dần hoặc giảm dần dựa trên một hoặc nhiều cột. Điều này rất hữu ích khi bạn muốn kết quả trả về từ cơ sở dữ liệu có trật tự rõ ràng, chẳng hạn như sắp xếp theo ngày tạo, tên người dùng, hoặc bất kỳ cột nào khác.
PHP cung cấp hai cách phổ biến để sử dụng mệnh đề ORDER BY khi truy vấn MySQL: sử dụng mysqli hoặc PDO.
1. Cách sử dụng ORDER BY
ORDER BY column_name ASC: Sắp xếp dữ liệu theo thứ tự tăng dần (mặc định là tăng dần).ORDER BY column_name DESC: Sắp xếp dữ liệu theo thứ tự giảm dần.
Bạn cũng có thể sắp xếp theo nhiều cột:
ORDER BY column1 ASC, column2 DESC: Sắp xếp dữ liệu đầu tiên theocolumn1tăng dần, sau đó theocolumn2giảm dần nếu có giá trị trùng lặp trongcolumn1.
2. Sử dụng mysqli với ORDER BY
a) Hướng đối tượng (OOP)
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
// Câu lệnh SQL sử dụng ORDER BY để sắp xếp kết quả theo `username` tăng dần
$sql = "SELECT id, username, email FROM Users ORDER BY username ASC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Lặp qua các bản ghi kết quả
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Không có kết quả.";
}
// Đóng kết nối
$conn->close();
?>Giải thích:
ORDER BY username ASC: Sắp xếp kết quả trả về theo cộtusernametheo thứ tự tăng dần.$result->fetch_assoc(): Trả về kết quả dưới dạng mảng kết hợp cho từng bản ghi.
b) Hướng thủ tục
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if (!$conn) {
die("Kết nối thất bại: " . mysqli_connect_error());
}
// Câu lệnh SQL sử dụng ORDER BY để sắp xếp kết quả theo `id` giảm dần
$sql = "SELECT id, username, email FROM Users ORDER BY id DESC";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// Lặp qua các bản ghi kết quả
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Không có kết quả.";
}
// Đóng kết nối
mysqli_close($conn);
?>Giải thích:
ORDER BY id DESC: Sắp xếp kết quả theo cộtidtheo thứ tự giảm dần.mysqli_query(): Thực hiện truy vấn SQL theo mô hình hướng thủ tục.
3. Sử dụng PDO với ORDER BY
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
try {
// Tạo kết nối PDO
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Câu lệnh SQL sử dụng ORDER BY để sắp xếp kết quả theo `email` tăng dần
$stmt = $conn->prepare("SELECT id, username, email FROM Users ORDER BY email ASC");
$stmt->execute();
// Lấy kết quả trả về dưới dạng mảng kết hợp
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($stmt->rowCount() > 0) {
foreach ($result as $row) {
echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
}
} else {
echo "Không có kết quả.";
}
} catch(PDOException $e) {
echo "Lỗi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
ORDER BY email ASC: Sắp xếp các bản ghi theo cộtemailtheo thứ tự tăng dần.fetchAll(PDO::FETCH_ASSOC): Lấy tất cả các bản ghi kết quả dưới dạng mảng kết hợp (associative array).
4. Sử dụng ORDER BY với nhiều cột
Bạn có thể sắp xếp kết quả theo nhiều cột bằng cách sử dụng dấu phẩy để phân tách các cột trong mệnh đề ORDER BY.
Ví dụ: Sắp xếp theo username và id
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
// Câu lệnh SQL sắp xếp theo `username` tăng dần và `id` giảm dần
$sql = "SELECT id, username, email FROM Users ORDER BY username ASC, id DESC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Lặp qua các bản ghi kết quả
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Không có kết quả.";
}
// Đóng kết nối
$conn->close();
?>Giải thích:
ORDER BY username ASC, id DESC: Sắp xếp kết quả theo cộtusernametăng dần. Nếu có nhiều bản ghi có cùng giá trịusername, chúng sẽ được sắp xếp theoidgiảm dần.
5. Sử dụng Prepared Statements với ORDER BY
Khi sử dụng Prepared Statements trong PHP, bạn có thể kết hợp mệnh đề ORDER BY để bảo vệ truy vấn khỏi các cuộc tấn công SQL Injection và thực thi truy vấn an toàn.
a) Sử dụng Prepared Statements với mysqli
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
// Chuẩn bị câu lệnh SQL với ORDER BY
$stmt = $conn->prepare("SELECT id, username, email FROM Users WHERE username = ? ORDER BY id DESC");
$stmt->bind_param("s", $username);
// Gán giá trị và thực thi câu lệnh
$username = "john_doe";
$stmt->execute();
// Liên kết kết quả
$stmt->bind_result($id, $username, $email);
// Hiển thị kết quả
while ($stmt->fetch()) {
echo "ID: $id - Username: $username - Email: $email<br>";
}
// Đóng câu lệnh và kết nối
$stmt->close();
$conn->close();
?>b) Sử dụng Prepared Statements với PDO
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
try {
// Tạo kết nối PDO
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Chuẩn bị câu lệnh SQL với ORDER BY
$stmt = $conn->prepare("SELECT id, username, email FROM Users WHERE username = :username ORDER BY id DESC");
$stmt->bindParam(':username', $username);
// Gán giá trị và thực thi câu lệnh
$username = 'john_doe';
$stmt->execute();
// Lấy kết quả trả về dưới dạng mảng kết hợp
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Hiển thị kết quả
foreach ($result as $row) {
echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
}
} catch(PDOException $e) {
echo "Lỗi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
- Prepared Statements giúp bảo vệ truy vấn khỏi các cuộc tấn công SQL Injection bằng cách tách biệt dữ liệu người dùng khỏi câu lệnh SQL.
- Mệnh đề
ORDER BYđược kết hợp với điều kiện trong câu lệnh SQL để sắp xếp kết quả trả về.
6. Kết luận
Mệnh đề ORDER BY trong SQL là một công cụ mạnh mẽ để sắp xếp dữ liệu trả về từ cơ sở dữ liệu theo thứ tự bạn mong muốn. Bạn có thể sắp xếp theo thứ tự tăng dần hoặc giảm dần, và có thể sử dụng nhiều cột để sắp xếp kết quả một cách linh hoạt.
mysqlivàPDO: Cả hai đều hỗ trợ mệnh đềORDER BYđể sắp xếp kết quả trả về từ MySQL.- Prepared Statements: Sử dụng Prepared Statements giúp bảo vệ truy vấn SQL khỏi các cuộc tấn công SQL Injection và cải thiện tính an toàn cho ứng dụng.
Sử dụng ORDER BY giúp dữ liệu được hiển thị có trật tự và dễ hiểu hơn, đặc biệt khi bạn làm việc với các trang hiển thị danh sách, bảng dữ liệu hoặc báo cáo.









