Mysql
 sql >> Baza danych >  >> RDS >> Mysql

zdobądź wszystkie elementy kategorii i jej dziecko

Najprawdopodobniej chciałbyś zrobić zagnieżdżone zestawy. Są trochę trudne do skonfigurowania, ale sprawiają, że zapytania są DUŻO prostsze. Tak więc, zamiast nadrzędnej kategorii, będziesz mieć dwie kolumny - lft i rgt . Lewa i prawa strona są w zasadzie granicami kategorii, jeśli identyfikator kategorii znajduje się między tymi wartościami, wiesz, że jest to element potomny tej kategorii.

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

Następnie, aby uzyskać liczbę pozycji w kategorii samochodów, możesz to zrobić w bardzo prosty sposób:

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'

Oczywiście możesz po prostu zmienić wartość category_name i zdobądź przedmioty w DOWOLNEJ kategorii.

Przepraszamy, z jakiegoś powodu obraz obrócił się po przesłaniu go tutaj, ale jeśli narysujesz swoje kategorie jako koła, a następnie ponumerujesz linie, możesz zobaczyć, jaka powinna być wartość dla lewej i prawej strony.

Robiłem tylko samochody, ponieważ pomyślałem, że można ekstrapolować, aby uzyskać inne kategorie.

Więc jeśli piszesz swoje kategorie w ten sposób:

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

Następnie możesz oznaczyć swój nawias liczbami:

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]

Lub jeśli narysujesz to jako drzewo, możesz oznaczyć je w ten sposób, gdzie oznaczysz lewy najbardziej lewy węzeł numerem, a prawy węzeł oznaczysz tylko wtedy, gdy oznaczysz wszystkie jego elementy podrzędne:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapisywanie ciągu JSON w bazie danych MySQL

  2. PHP MySql:Drukuj drzewo — pole wyboru rodzic-dziecko

  3. Jak zainstalować MySQLdb w Mountain Lion

  4. Jak mogę przesłać poszczególne wiersze CSV do różnych tabel w PHP?

  5. Wstawianie tekstu z obszaru tekstowego do bazy danych MySQL bez utraty formatowania