Tôi sẽ sử dụng ORDER BY category
thay thế. Sau đó, bạn có thể lặp lại tập kết quả như
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Cập nhật
Có ba giải pháp khả thi cho đến bây giờ trong chuỗi này cho chính vấn đề.
Tùy chọn ban đầu 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Nếu một người chỉ muốn nhận từng danh mục mẹ một lần, người ta nên sử dụng DISTINCT
thay thế. Không nên sử dụng GROUP BY
mà không cần sử dụng bất kỳ chức năng tổng hợp nào. Kết hợp GROUP BY
với SELECT *
được giới hạn cho (hầu hết) MySQL. Bạn không thể chọn các cột tùy ý trong trường hợp này trong ASNI SQL.
Một biến thể của tùy chọn 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Đây là phiên bản đã sửa với DISTINCT
thay vì GROUP BY
.
Nó vẫn thiếu các cuộc gọi truy vấn lồng nhau. Đối với 5 danh mục chính, điều này dẫn đến 5 truy vấn trong vòng lặp. Đối với 10 danh mục chính, đã có 10 truy vấn bên trong. Người ta nên tránh kiểu phát triển này nói chung.
Tùy chọn 3
SELECT * FROM content ORDER BY category, menu_name
có thể sử dụng được với đoạn mã trên.
Tùy chọn này tốt hơn các tùy chọn khác được hiển thị do các lý do khác nhau:
- Bạn chỉ cần một truy vấn cơ sở dữ liệu duy nhất để thu thập tất cả dữ liệu cùng một lúc. Cơ sở dữ liệu dành phần lớn thời gian (cho các truy vấn dễ dàng) để phân tích cú pháp câu lệnh SQL được cung cấp và chỉ một phần thời gian để thực sự thu thập dữ liệu bạn yêu cầu. Nếu bạn cung cấp nhiều mã SQL, bạn sẽ phải mất rất nhiều thời gian để phân tích cú pháp. Nếu bạn cung cấp ít mã hơn, thì việc đó sẽ ít phải làm hơn.
- Cơ sở dữ liệu sẽ dễ dàng hơn khi lấy dữ liệu một lần, sắp xếp một lần và trả lại cho bạn một lần, thay vì tập hợp một phần, hãy sắp xếp một phần, trả lại một phần và bắt đầu lại từ đầu.
vẫn chưa xác định vị trí tùy chọn 4
Có một giải pháp khác chưa được đánh dấu cho đến bây giờ. Người ta có thể sử dụng các câu lệnh đã chuẩn bị sẵn, chuẩn bị SQL một lần và chạy nó với các id khác nhau. Điều này vẫn sẽ truy vấn tất cả các danh mục bên trong vòng lặp, nhưng sẽ tránh được sự cần thiết phải phân tích cú pháp mã SQL mọi lúc.
Trên thực tế, tôi không biết liệu điều này tốt hơn hay tệ hơn (hoặc ở giữa) so với giải pháp của tôi.