Запрос с таблицами категорий и подкатегорий

Aug 21 2020

У меня есть запрос PHP MySQL, который я пытаюсь выполнить ... В нем есть список элементов с категориями и подкатегориями. Я хочу отсортировать список по алфавиту, но с категориями (и содержащимися в них элементами) в списке. Например...

Есть три таблицы ... Таблица категорий (itemcats) ...

> itemcat   catname 
> 1         AGeneralCategory
> 2         Food
> 3         Clothing

Таблица подкатегорий (itemsubcats) и столбец родительской категории (itemcat) ...

> itemsubcat     itemcat   subcatname 
> 1              2         Fruit
> 2              2         Vegetables
> 3              2         Meat         
> 4              3         Shoewear
> 5              3         Hats

А затем таблица для отдельных предметов (предметов) ....

> itemid   itemname       itemcat   itemsubcat    
> 1        Apples         2         1
> 2        Sneakers       3         4
> 3        Onion          2         2
> 4        Banana         2         1
> 5        Steak          2         3
> 6        Sombrero       3         5
> 7        Sandals        3         4
> 8        Jeep           1         null
> 9        Baseball Cap   3         5
> 10       Mountain       1         null
> 11       Bread          2         null
> 12       Veggiemite     2         null

И желаемый результат. Примечание: я, вероятно, могу добавить имена категорий / подкатегорий с помощью PHP, но мне нужен список отдельных элементов, упорядоченных, как показано ниже ...

> [AGeneralCategory]
>   Jeep
>   Mountain
> [Clothing]
>   [Headwear]
>     Baseball Cap
>     Sombrero
>   [Shoewear]
>     Sandals
>     Sneakers
> [Food]
>   Bread
>   [Fruit]
>     Apple
>     Banana
>   [Meat]
>     Steak
>   Veggiemite
>   [Vegetables]
>     Onion

До сих пор я пробовал несколько JOINS ... но, похоже, не могу получить желаемых результатов ... Вот что у меня сейчас ...

SELECT a1.itemid iid, a1.itemname iname, a1.itemcat icat, a1.itemsubcat isub 
  FROM items a1 
  LEFT 
  JOIN itemcats b1 
    ON a1.itemcat = b1.itemcat 
  LEFT 
  JOIN itemsubcats c1 
    ON a1.itemsubcat = c1.itemsubcat 
 ORDER 
    BY a1.itemcat, a1.itemsubcat

ОБНОВЛЕНИЕ: вот финал, который, кажется, отлично работает ....

SELECT a.itemid,
        a.itemname, 
        a.itemcost,
        a.itemcostcoin,
        a.itemweight,
        a.itemdesc,
        a.itemcat,
        b.catname,  
        a.itemsubcat,
        c.subcatname
    FROM (SELECT
        itemid,
        itemcat,
        itemsubcat,
        itemname, 
        itemcost,
        itemcostcoin,
        itemweight,
        itemdesc
      FROM items
      UNION SELECT itemsubcat, 
        NULL AS itemcat,
        NULL AS itemsubcat,
        subcatname,
        NULL AS itemcost,
        NULL AS itemcostcoin,
        NULL AS itemweight,
        NULL AS itemdesc        
      FROM itemsubcats) 
    AS a 
LEFT JOIN itemcats b ON a.itemcat=b.itemcat 
LEFT JOIN itemsubcats c ON a.itemsubcat=c.itemsubcat 
WHERE a.itemcat='1'

Ответы

MKhalidJunaid Aug 21 2020 at 03:21

Вам необходимо исправить свой заказ по пункту и использовать имена для категорий и подкатегорий, а не их идентификаторы.

SELECT 
  b1.catname as catname,
  c1.subcatname as subcatname ,
  a1.itemid as iid,
  a1.itemname as iname
FROM items a1 
LEFT JOIN itemcats b1 ON a1.itemcat=b1.itemcat 
LEFT JOIN itemsubcats c1 ON a1.itemsubcat=c1.itemsubcat 
ORDER BY b1.catname, c1.subcatname

ДЕМО

Для просмотра в виде дерева вы можете преобразовать эти данные на уровне приложения (PHP).