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

#mysql

#mysql

Вопрос:

У меня есть запрос 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
  

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

 > 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
  

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

 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'
  

Ответ №1:

Вам нужно исправить ваше предложение order by и использовать имена для категории и подкатегории, а не их идентификаторы

 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)

Комментарии:

1. Потрясающе. Это очень помогло. Я переработал его с помощью выбора ОБЪЕДИНЕНИЯ, чтобы помочь с организацией (и я отредактирую выше).