Ja bym użył ORDER BY category
zamiast. Następnie możesz iterować zestaw wyników, tak jak
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Aktualizacja
W tym wątku istnieją trzy możliwe rozwiązania samego problemu.
Opcja oryginalna 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Jeśli ktoś chce tylko raz uzyskać każdą kategorię nadrzędną, powinien użyć DISTINCT
zamiast. Nie należy używać GROUP BY
bez korzystania z funkcji agregacji. Łączenie GROUP BY
z SELECT *
ogranicza się do (głównie) MySQL. W tym przypadku nie można wybrać dowolnych kolumn w ASNI SQL.
Wariant opcji 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
To jest poprawiona wersja z DISTINCT
zamiast GROUP BY
.
Nadal brakuje zagnieżdżonych wywołań zapytań. W przypadku 5 kategorii nadrzędnych prowadzi to do 5 zapytań w pętli. W przypadku 10 kategorii nadrzędnych jest już 10 zapytań. Należy generalnie unikać tego rodzaju uprawy.
Opcja 3
SELECT * FROM content ORDER BY category, menu_name
można używać z powyższym kodem.
Jest to lepsze niż inne pokazane opcje z różnych powodów:
- Do zebrania wszystkich danych naraz potrzebne jest tylko jedno zapytanie do bazy danych. Baza danych spędza (na łatwych zapytaniach) większość czasu na analizowaniu dostarczonej instrukcji SQL, a tylko ułamek czasu na faktyczne zebranie żądanych danych. Jeśli dostarczasz dużo kodu SQL, musi poświęcić dużo czasu na jego analizę. Jeśli dostarczasz mniej kodu, ma to mniej do zrobienia.
- Bazie danych łatwiej jest pobrać dane raz, raz je posortować i raz zwrócić, zamiast zebrać część, posortować część, zwrócić część i zacząć od nowa.
nadal nie wymieniona opcja 4
Istnieje do tej pory niewypowiedziane dalsze rozwiązanie. Można użyć przygotowanych instrukcji, przygotować SQL raz i uruchom go z różnymi identyfikatorami. To nadal spowodowałoby zapytania do wszystkich kategorii w pętli, ale pozwoliłoby uniknąć konieczności każdorazowego analizowania kodu SQL.
Właściwie nie wiem, czy to jest lepsze czy gorsze (lub coś pomiędzy) niż moje rozwiązanie.