Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Grupuj wyniki mysql według kategorii i wyświetlaj je w grupach w każdej kategorii

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd braku kolejności pakietów podczas wywoływania przechowywanego proc MySQL

  2. Zahibernować połączenie dwóch stołów i pobrać wszystkie rekordy?

  3. Przechowywanie dnia i miesiąca (bez roku)

  4. Jak działa funkcja TO_BASE64() w MySQL

  5. WYBRAĆ użytkowników z bazy danych MySQL według maski bitowej uprawnień?