Бих използвал ORDER BY category
вместо. След това можете да повторите набора от резултати като
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Актуализиране
Досега в тази тема съществуват три възможни решения на самия проблем.
Оригинална опция 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Ако човек иска да получи всяка родителска категория само веднъж, трябва да използва DISTINCT
вместо. Не трябва да се използва GROUP BY
без използване на функция за агрегиране. Комбиниране на GROUP BY
с SELECT *
е ограничен до (предимно) MySQL. В този случай не можете да избирате произволни колони в ASNI SQL.
Вариант на опция 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Това е коригираната версия с DISTINCT
вместо GROUP BY
.
Все още липсват вложени извиквания на заявка. За 5 родителски категории това води до 5 заявки в цикъла. За 10 родителски категории вече има 10 заявки вътре. Човек трябва да избягва този вид отглеждане като цяло.
Опция 3
SELECT * FROM content ORDER BY category, menu_name
може да се използва с кода по-горе.
Това е за предпочитане пред другите показани опции поради различни причини:
- Необходима ви е само една заявка към база данни, за да съберете всички данни наведнъж. Базата данни прекарва (за лесни заявки) по-голямата част от времето си за анализиране на предоставения SQL израз и само малка част от времето, за да събере действително данните, които сте поискали. Ако предоставите много SQL код, той трябва да отдели много време за анализирането му. Ако предоставите по-малко код, той има по-малко работа.
- За база данни е по-лесно да получи данните веднъж, да ги сортира веднъж и да ви ги върне веднъж, вместо да събира част, сортира част, връща част и започва отначало.
все още неустановена опция 4
Съществува до този момент непосочено допълнително решение. Човек може да използва подготвени оператори, да подготви SQL веднъж и го стартирайте с различни идентификатори. Това ще направи заявка за всички категории вътре в цикъла, но ще избегне необходимостта от анализиране на SQL код всеки път.
Всъщност не знам дали това е по-добро или по-лошо (или нещо между другото) от моето решение.