Kueri dengan tabel Kategori dan Subkategori

Aug 21 2020

Saya memiliki kueri PHP MySQL yang saya coba lakukan ... Ini memiliki daftar item dengan kategori dan sub kategori. Saya ingin mengurutkan daftar menurut abjad, tetapi dengan kategori (dan item yang ada di dalamnya) dalam daftar. Sebagai contoh...

Ada tiga tabel ... Tabel kategori (itemcats) ...

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

Tabel subkategori (itemsubcats) dan kolom kategori induk (itemcat) ...

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

Dan kemudian tabel untuk masing-masing item (item) ....

> 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

Dan hasil yang diinginkan. Catatan: Saya mungkin dapat menambahkan nama kategori / subkategori menggunakan PHP, tetapi saya memerlukan daftar item individual yang diurutkan seperti di bawah ini ...

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

Sejauh ini saya sudah mencoba beberapa GABUNG ... tetapi sepertinya tidak mendapatkan hasil yang diinginkan ... Inilah yang saat ini saya miliki ...

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

PEMBARUAN: Ini adalah final, yang tampaknya berfungsi dengan baik ....

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'

Jawaban

MKhalidJunaid Aug 21 2020 at 03:21

Anda perlu memperbaiki pesanan Anda dengan klausa dan menggunakan nama untuk kategori dan sub kategori bukan id mereka

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

Untuk tampilan hierarki, Anda dapat mengubah data ini di lapisan aplikasi Anda (PHP)