Mysql
 sql >> база данни >  >> RDS >> Mysql

Групирайте mysql резултатите по категория и ги покажете в групи във всяка категория

Бих използвал 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 код всеки път.

Всъщност не знам дали това е по-добро или по-лошо (или нещо между другото) от моето решение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да свържете параметри към необработена DB заявка в Laravel, която се използва в модел?

  2. Как групово да актуализирате mysql данни с една заявка?

  3. Избиране на редове, където полето е нула, като се използват PHP PDO подготвени изрази и MySQL

  4. съхраняване на отрицателно число в десетичното поле на таблицата на mysql от версия 5.0.3

  5. MySQL Как да INSERT INTO таблица с подзаявка SELECT, връщаща няколко реда?