Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

nhận tất cả các mục của danh mục và con của nó

Bạn rất có thể muốn thực hiện các tập hợp lồng nhau. Chúng hơi phức tạp để thiết lập, nhưng làm cho các truy vấn trở nên đơn giản hơn RẤT NHIỀU. Vì vậy, thay vì danh mục gốc, bạn sẽ có hai cột - lftrgt . Trái và phải về cơ bản là ranh giới của một danh mục, nếu id danh mục của một mục nằm giữa các giá trị đó, bạn biết rằng nó là con của danh mục đó.

+----+---------------+-----+------+
| 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   |
+----+---------------+-----+------+

Sau đó, để có được số lượng mục trong danh mục ô tô, bạn có thể thực hiện siêu đơn giản như sau:

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'

Rõ ràng là bạn chỉ có thể thay đổi giá trị của category_name và nhận các mặt hàng trong BẤT KỲ danh mục nào.

Xin lỗi, vì một số lý do mà hình ảnh đã xoay khi tôi tải nó lên đây, nhưng nếu bạn vẽ các danh mục của mình dưới dạng vòng tròn, sau đó đánh số các dòng, bạn có thể thấy giá trị phải là bao nhiêu cho trái và phải.

Tôi chỉ làm ô tô vì tôi nghĩ rằng bạn có thể ngoại suy để có được các danh mục khác.

Vì vậy, nếu bạn viết ra các danh mục của mình như thế này:

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

Sau đó, bạn có thể gắn nhãn dấu ngoặc đơn của mình bằng các số:

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]

Hoặc nếu bạn lập biểu đồ dưới dạng cây, bạn có thể gắn nhãn nó như thế này, trong đó bạn gắn nhãn nút ngoài cùng bên trái bằng một số và chỉ gắn nhãn nút bên phải khi bạn đã gắn nhãn tất cả các nút con của nó:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định cấu hình sao chép cơ sở dữ liệu MySQL Master-Master

  2. CẬP NHẬT tất cả các giá trị cột tương đương với một giá trị cột của bảng khác dựa trên id của chúng

  3. MySQL phân biệt giữa e và é (e cấp tính) - Chỉ mục DUY NHẤT

  4. LỖI 1067 (42000):Giá trị mặc định không hợp lệ cho 'create_at'

  5. Cuộn vô hạn với dữ liệu MySQL