Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pomoc z zapytaniem do MySQLa
Forum PHP.pl > Forum > Przedszkole
csharp
Cześć, męczę się i męczę i sam chyba już nie wymęczę...

posiadam dwie tabele:

categories:
id category id_parent (tabela ta tworzy mi drzewo kategorii)
------------------------
1 główna 0
2 główna_inna 0
3 podkategoria 1
4 podpodkategoria 1

products:
id id_cat title text (gdzie id_cat = id tabeli categories)
1 3 produkt opis
2 3 produkt opis
3 4 produkt opis

bez problemu sobie pobieram produkty dla konkretnego id z tabeli kategorii (mam zmienną id=3 (3 to numer kategorii) za pomocą której zasysam dane z produktów (produkty przypisane do kategorii, które mają id_cat=3).

problem się zaczyna gdy chcę wyświetlić główną kategorię np dostaję dane $id=1 i do niej nie ma żadnych produktów przypisanych ale są przypisane do podkategorii, które należą do id=1.

da się to teraz jakoś sklecić sql aby mi wypluł takie dane? czyli produkty dla numeru id, który otrzymujemy np. id=1 oraz jeśli istnieje przypisany numer id_parent to również produkty przypisane do niego.

coś takiego zacząłem robić ale niestety - danych jest za dużo powielonych... coś tam idę w dobrym kierunku ale potrzebuje pomocy smile.gif z góry dzięki!

  1. SELECT p.id, p.id_cat, p.title, p.text, c.id, c.category, c.id_parent FROM products AS p, categories AS c
  2. WHERE p.id_cat=$id OR c.id_parent = $id

mmmmmmm
  1. SELECT p.id, p.id_cat, p.title, p.text, c.id, c.category, c.id_parent FROM products AS p JOIN categories AS c ON c.id=p.id_cat WHERE $id IN (c.id, c.id_parent)
csharp
dzięki wielkie - taka pomoc mnie motywuje do nauki SQLa smile.gif nie za bardzo rozumiem końcówki tego zapytania ale sobie doczytam - ważne, że to działa.

w tej chwili fajnie mi pokazuje produkty przy wyborze kategorii matki, wszystkie produkty, które są przypisane do dzieci. Jednak nie pokazuje mi już produktów, które są przypisane do dzieci i jeszcze ich dzieci...

patrząc na możliwość ustanawiania dowolnie "głębokich" kategorii, którą stworzyłem, zastanawiam się czy nie skopałem bazy na samym początku, czyli błędnie stworzone tabele - chyba, że uratuje mnie sql i można to jakoś rozwiązać... co o tym myślicie?

i czy ew. można było lepiej to zrobić?

mysql> show tables;
+--------------------+
| Tables_in_xxxx |
+--------------------+
| admins |
| categories |
| photos |
| products |
+--------------------+

mysql> select * from categories;
+----+----------------------------------------+-----------+
| id | category | id_parent |
+----+----------------------------------------+-----------+
| 1 | Ochrona r?k | 0 |
| 2 | Ochrona cia?a | 0 |
| 3 | Ochrona przed upadkiem z wysoko?ci | 0 |
| 4 | Ochrona g?owy | 0 |
| 5 | Ochrona s?uchu | 0 |
| 6 | Ochrona oczu i twarzy | 0 |
| 7 | Ochrona dr?g oddechowych | 0 |
| 8 | Ochrona n?g | 0 |
| 9 | Higiena i czysto?? | 0 |
| 10 | Wyposa?enie zak?ad?w / narz?dzia gertu | 0 |
| 11 | Ochrona PPO? | 0 |
| 12 | Pozosta?e artyku?y | 0 |
| 31 | podkategoria testowa | 1 |
+----+----------------------------------------+-----------+


mysql> select * from products;
+----+--------+-------------------+---------------------------------+
| id | id_cat | title | text |
+----+--------+-------------------+---------------------------------+
| 39 | 31 | PRODUKT TESTOWY | Opis produktu testowego |
| 40 | 31 | PRODUKT TESTOWY 2 | Opis do produktu testowego nr 2 |
+----+--------+-------------------+---------------------------------+

mysql> select * from photos;
+----+------------+----------------------------------+
| id | id_product | path |
+----+------------+----------------------------------+
| 40 | 39 | uploads/rekawice2_1342264999.jpg |
| 42 | 39 | uploads/rekawice1_1342265507.jpg |
+----+------------+----------------------------------+

d3ut3r
Struktura tylko z polem parent_id jest najprostsza (najczęściej spotykana) lecz chyba najmniej optymalna. Temat drzewek kategorii jest w sumie bardzo rozległy istnieje sporo metod na rozwiązanie tego problemu. Jeden z ciekawszych wpisów na ten temat jaki czytałem:

http://blog.mwojcik.pl/2008/02/17/drzewa-k...-php-metoda-ip/

traktuje on o metodzie IP masz też podane w przykładach najczęściej spotykane operacje na takim drzewie.
csharp
ok zagłębiłem się w te kategorie i nie znalazłem niczego, czego bym nie wiedział smile.gif

w dalszym ciągu nie wiem jak wyświetlić produkty zaznaczonych kategorii, gdy otrzymuje dane wejściowe dla rodzica... w tej chwili zapytanie pokazuje mi produkty przypisane do rodzica i pierwszego dziecka - nie zagłębia się dalej.

rodzic->dziecko1->dziecko2->dziecko3
-> dziecko4
->dziecko5 -> dziecko

zapytanie, które dał mi @mmmmmmm jest dobre, jednak brakuje tutaj wejścia głębiej w podkategorie, nie wiem czy da się to z automatu jakoś sprawdzić i wejść głębiej.

rozumiecie mnie ;d ?
mmmmmmm
Nie pisałeś, że masz 'głębszą' strukturę. Dlatego moje zapytanie ograniczylo się do jedneog poziomu ( i podpoziomów). To, czego szukasz nie zrobisz inaczej niż rekurencją (bardzo niewydajną w bazach danych)
csharp
Czyli samym SQLem jest raczej niewykonalne?
Ok, w takim razie zrobię to rekurencją... Chociaż też wolałem tego unikać:/
mmmmmmm
Można SQL (moje zdanie jest take, że SQL-em wszystko można), ale szkoda czasu...
Chociaz możesz sobie pomóc... Potrzebujesz tylko w tabeli dodatkowe pole, które w jakiś magiczny sposób będzie przechowywać CAŁĄ ścieżkę:
1 root
2 podkatalog 1
3 podkatalog2 1
4 podkatalog glebiej 1\2
5 jeszcze gflebiej 1\2\4
itd...
chyba już wiesz, do czego zmierzam?
irmidjusz
csharp, możesz zrobić jak napisał mmmmmm, ewentualnie użyć modelu nested set albo closure table. Wszystkie te rozwiązania lepiej się nadają do pobierania drzewiastych danych, niż użyty przez Ciebie sposób.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.