Mysql
 sql >> база данни >  >> RDS >> Mysql

вземете всички елементи от категорията и нейното дете

Най-вероятно бихте искали да правите вложени набори. Те са малко трудни за настройка, но правят заявките МНОГО по-лесни. Така че, вместо родител на категорията, ще имате две колони - lft и rgt . Лявото и дясното са основно границите на категория, ако идентификаторът на категория на елемент е между тези стойности, вие знаете, че това е дъщерно на тази категория.

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

След това, за да получите броя на артикулите в категорията автомобили, можете да го направите супер просто така:

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'

Очевидно можете просто да промените стойността на category_name и вземете артикулите във ВСЯКА КАТЕГОРИЯ.

Съжалявам, по някаква причина изображението се завъртя, когато го качих тук, но ако начертаете категориите си като кръгове и след това номерирате редовете, можете да видите каква трябва да бъде стойността за ляво и дясно.

Правих само коли, тъй като реших, че можете да екстраполирате, за да получите другите категории.

Така че, ако напишете категориите си така:

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

След това можете да маркирате скобите си с числа:

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]

Или ако го очертаете като дърво, можете да го обозначите по следния начин, където маркирате най-левия възел с число и маркирате десния възел само когато сте обозначили всички негови дъщерни:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Пребройте записи от една таблица и след това актуализирайте друга

  2. В MySQL мога ли да върна изтрити редове след изтриване?

  3. Не мога да използвам mysql_* функции след надграждане на PHP

  4. Как да стартирам тестовата база данни на Django само в паметта?

  5. получите грешка .findOrCreate().