Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

dapatkan semua item kategori dan anaknya

Anda kemungkinan besar ingin melakukan set bersarang. Mereka sedikit sulit untuk diatur, tetapi membuat kueri JAUH lebih sederhana. Jadi, alih-alih induk kategori, Anda akan memiliki dua kolom - lft dan rgt . Kiri dan kanan pada dasarnya adalah batas kategori, jika id kategori item berada di antara nilai-nilai tersebut, Anda tahu bahwa itu adalah anak dari kategori tersebut.

+----+---------------+-----+------+
| id | category name | lft | rgt  |
+----+---------------+-----+------+
| 1  | cars          |  1  |  24  |
+----+---------------+-----+------+
| 2  | bmw           |  2  |  3   |
+----+---------------+-----+------+
| 5  | audi          |  4  | 23   |
+----+---------------+-----+------+
| 6  | 100           |  5  |  6   |
+----+---------------+-----+------+
| 7  | 80            |  7  |  8   |
+----+---------------+-----+------+
| 8  | A4            |  9  | 22   |
+----+---------------+-----+------+
| 9  | TDI           |  10 | 11   |
+----+---------------+-----+------+
| 10 | Quatro        |  12 | 21   |
+----+---------------+-----+------+
| 11 | Black         |  13 | 18   |
+----+---------------+-----+------+
| 12 | White         |  19 |  20  |
+----+---------------+-----+------+
| 13 | 2 doors       |  14 |  15  |
+----+---------------+-----+------+
| 14 | 5 doors       |  16 | 17   |
+----+---------------+-----+------+

Lalu, untuk mendapatkan jumlah item dalam kategori mobil, kamu bisa melakukannya dengan sangat sederhana seperti ini:

SELECT categories.name, items.id, items.category_id, items.name 
FROM categories 
LEFT JOIN items 
    ON (items.category_id BETWEEN categories.lft AND categories.rgt)
WHERE categories.category_name = 'cars'

Jelas Anda bisa mengubah nilai category_name dan dapatkan item dalam kategori APAPUN.

Maaf, untuk beberapa alasan gambar berputar ketika saya mengunggahnya di sini, tetapi jika Anda menggambar kategori Anda sebagai lingkaran, dan kemudian memberi nomor pada garis, Anda dapat melihat berapa nilainya untuk kiri dan kanan.

Saya hanya mengerjakan mobil karena saya pikir Anda bisa memperkirakan untuk mendapatkan kategori lainnya.

Jadi jika Anda menulis kategori Anda seperti ini:

Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))

Kemudian Anda dapat memberi label tanda kurung dengan angka:

Cars[1]->(BMW[2]->()<-[3], Audi[4]->(100[5]->()<-[6],80[7]->()<-[8],A4[9]->(TDI[10]->()<-[11],Quatro[12]->(Black[13]->(2dr[14]->()<-[15], 5dr[16]->()<-[17])<-[18], White[19]->()<-[20])<-[21])<-[22])<-[23])<-[24]

Atau jika Anda memetakannya sebagai pohon, Anda dapat memberi label seperti ini, di mana Anda memberi label pada simpul paling kiri dengan angka, dan hanya memberi label pada simpul kanan jika Anda telah memberi label pada semua turunannya:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbandingan INT tanpa pernyataan WHERE

  2. Tampilkan menu pohon dari induk yang dipilih

  3. BUAT JENIS di MySQL

  4. MySQL - interval bulan DATE_ADD

  5. mysqli_num_rows tidak berfungsi dengan benar