Saya akan menggunakan ORDER BY category
sebagai gantinya. Anda kemudian dapat mengulangi set hasil seperti
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Perbarui
Ada tiga kemungkinan solusi sampai sekarang di utas ini untuk masalah itu sendiri.
Opsi awal 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Jika seseorang hanya ingin mendapatkan setiap kategori induk sekali, ia harus menggunakan DISTINCT
sebagai gantinya. Seseorang tidak boleh menggunakan GROUP BY
tanpa menggunakan fungsi agregasi. Menggabungkan GROUP BY
dengan SELECT *
terbatas pada (kebanyakan) MySQL. Anda tidak dapat memilih kolom sembarang dalam kasus ini di ASNI SQL.
Varian opsi 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Ini adalah versi yang dikoreksi dengan DISTINCT
bukannya GROUP BY
.
Masih kekurangan panggilan kueri bersarang. Untuk 5 kategori induk, ini mengarah ke 5 kueri dalam loop. Untuk 10 kategori induk, sudah ada 10 kueri di dalamnya. Seseorang harus menghindari pertumbuhan semacam ini secara umum.
Opsi 3
SELECT * FROM content ORDER BY category, menu_name
dapat digunakan dengan kode di atas.
Ini lebih disukai daripada opsi lain yang ditampilkan karena alasan yang berbeda:
- Anda hanya memerlukan satu kueri database untuk mengumpulkan semua data sekaligus. Basis data menghabiskan (pada kueri mudah) sebagian besar waktunya untuk menguraikan pernyataan SQL yang disediakan dan hanya sebagian kecil waktu untuk benar-benar mengumpulkan data yang Anda minta. Jika Anda menyediakan banyak kode SQL, itu harus menghabiskan banyak waktu untuk menguraikannya. Jika Anda memberikan lebih sedikit kode, itu berarti lebih sedikit yang harus dilakukan.
- Lebih mudah bagi database untuk mendapatkan data satu kali, mengurutkannya sekali dan mengembalikannya kepada Anda sekali, daripada mengumpulkan bagian, mengurutkan bagian, mengembalikan bagian dan memulai dari awal lagi.
pilihan 4 yang masih belum disebutkan
Ada solusi lebih lanjut yang sampai sekarang tidak disebutkan. Seseorang dapat menggunakan pernyataan yang disiapkan, siapkan SQL sekali dan jalankan dengan id yang berbeda. Ini masih akan menanyakan semua kategori di dalam loop, tetapi akan menghindari keharusan untuk mengurai kode SQL setiap saat.
Sebenarnya saya tidak tahu apakah ini lebih baik atau lebih buruk (atau di antaranya) daripada solusi saya.