Consulta com tabelas de categorias e subcategorias
Eu tenho uma consulta PHP MySQL que estou tentando fazer... Tem uma lista de itens com categorias e subcategorias. Eu quero classificar a lista em ordem alfabética, mas com categorias (e seus itens contidos) na lista. Por exemplo...
Existem três tabelas ... Uma tabela de categoria (itemcats) ...
> itemcat catname
> 1 AGeneralCategory
> 2 Food
> 3 Clothing
Uma tabela de subcategorias (itemsubcats) e uma coluna da categoria pai (itemcat) ...
> itemsubcat itemcat subcatname
> 1 2 Fruit
> 2 2 Vegetables
> 3 2 Meat
> 4 3 Shoewear
> 5 3 Hats
E então a tabela para os itens individuais (itens)....
> 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
E os resultados desejados. Observação: provavelmente posso adicionar os nomes das categorias/subcategorias usando PHP, mas preciso da lista de itens individuais ordenados como abaixo...
> [AGeneralCategory]
> Jeep
> Mountain
> [Clothing]
> [Headwear]
> Baseball Cap
> Sombrero
> [Shoewear]
> Sandals
> Sneakers
> [Food]
> Bread
> [Fruit]
> Apple
> Banana
> [Meat]
> Steak
> Veggiemite
> [Vegetables]
> Onion
Até agora, tentei alguns JOINS ... mas não consigo obter os resultados desejados ... Aqui está o que tenho atualmente ...
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
ATUALIZAÇÃO: Aqui está a final, que parece funcionar muito bem....
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'
Respostas
Você precisa corrigir sua ordem por cláusula e usar nomes para categoria e subcategoria, não seus IDs
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
DEMO
Para exibição em árvore, você pode transformar esses dados em sua camada de aplicativo (PHP)