Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Pomoc z zapytaniem do MySQLa
csharp
post 14.07.2012, 22:22:07
Post #1





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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



--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
mmmmmmm
post 14.07.2012, 23:01:41
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  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)
Go to the top of the page
+Quote Post
csharp
post 15.07.2012, 09:21:53
Post #3





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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



--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
d3ut3r
post 15.07.2012, 09:35:41
Post #4





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


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.


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
csharp
post 15.07.2012, 17:43:22
Post #5





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 ?


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
mmmmmmm
post 15.07.2012, 19:55:26
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
csharp
post 15.07.2012, 22:18:06
Post #7





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Czyli samym SQLem jest raczej niewykonalne?
Ok, w takim razie zrobię to rekurencją... Chociaż też wolałem tego unikać:/


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
mmmmmmm
post 15.07.2012, 22:20:45
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
irmidjusz
post 16.07.2012, 10:07:03
Post #9





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


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.


--------------------
there is much to be learned
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 19:18