![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Nieautoryzowani Postów: 34 Pomógł: 1 Dołączył: 22.06.2009 Skąd: Koszalin/Poznań Ostrzeżenie: (0%) ![]() ![]() |
Witam. Mam następujący problem:
Są 2 tabele: produkty, parametry w tabeli 'produkty' są pola: id_produktu, nazwa w tabeli 'parametry' są pola: id_produktu, parametr, wartosc Omawiając. Każdy produkt ma kilka parametrów. Każdy parametr ma jakąś wartość. Mam 3 produkty: pr1, pr2, pr3. Mam też ogólnie 3 parametry: wys, szer, waga. Łącznie w tabeli 'parametry' mam 9 rekordów, po 3 pary >parametr i wartość parametru< dla każdego z produktów. Chciałbym napisać takie zapytanie które wybierze mi produkty spełniające WSZYSTKIE określone warunki w jednym zapytaniu czyli np: 'wys' BETWEEN 30 AND 100, oraz 'szer' BETWEEN 60 AND 100 oraz 'waga' BETWEEN 10 AND 100 Próbowałem już kombinować na różne sposoby, ale nie chce mi wyjść. Otrzymuję albo wyniki produktów spełniających dowolne kryterium, lub jeśli w HAVING użyję "AND" - brak wyników, co jest oczywiste gdyż nie ma dwóch rekordów spełniających warunki na AND.
Ma ktoś na to jakiś mądry sposób? Z góry dziękuję za podpowiedzi. Ten post edytował lorak110786 5.10.2010, 14:40:09 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 30 Pomógł: 0 Dołączył: 11.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem jak to zadziała, bo pisane bez sprawdzania, ale ja bym to chyba tak zrobił:
|
|
|
![]()
Post
#3
|
|
Grupa: Nieautoryzowani Postów: 34 Pomógł: 1 Dołączył: 22.06.2009 Skąd: Koszalin/Poznań Ostrzeżenie: (0%) ![]() ![]() |
No to jest pierwsza rzecz jaką próbowałem zrobić. Niestety wybiera źle. Wybiera rekordy które spełniają dowolne z warunków (gdyż użyte jest OR).
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 30 Pomógł: 0 Dołączył: 11.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
Hmm...Opierałem się na tym przykładzie, co wstawiłeś. Gdybym chciał pobrać wszystkie produkty, które spełniają pewne założenia, to bym zrobił coś takiego:
Coś takiego powinno zwrócić wszystkie produkty, których value1 zawiera się w przedziale 50-100 a value2 w przedziale 15-30. |
|
|
![]()
Post
#5
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Trzeba zastosować podobne rozwiązanie jak tu:
http://forum.php.pl/index.php?s=&showt...st&p=793421 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 159 Pomógł: 5 Dołączył: 31.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
w serwisie erobay.pl zastosowałem taki oto format:
Kategorie produktów, a do każdej (zaczynając od rodzica - potomkowie dziedziczą parametry) dodałem parametry. Każdy z nich zadeklarowałem w/g takich wartości jak: checkbox, select i range. Każde z nich ma na celu dać użytkownikowi pożądany sposób przefiltrowania informacji oraz przy wysłaniu formularza przygotowanie odpowiedniego zapytania do bazy danych. I tak w przypadku jeśli parametrem jest checkbox wtedy każdy kolejny parametr z tej grupy rozdzielany jest jako OR (tak by dopasować maksymalnie dużo pasujących wyników). Gdy wybierze ktoś select to wtedy tylko i wyłącznie wybrana wartość jest brana pod uwagę... Range - czyli zakres, wtedy system wypisze pole w stylu Cena od: [____] do: [____] - i analogicznie dobierze zapytanie które określi zakres (IMG:style_emoticons/default/smile.gif) Tyle w teorii.. W praktyce wygląda to tak:
Opis pól: PRM_Id - id rekordu w tej tabeli CAT_Id - id kategorii od której zaczyna się ten parametr (wszystkie kategorie dzieci będą dziedziczyć ten parametr) PRM_Name - nazwa pola widzialna dla użytkownika: np. Kolor PRM_FormName - nazwa pola w formularzu PRM_Type - czyli to ten wybór z wspomnianych informacji powyżej... PRM_MultiSelect - to nie jest potrzebne do tego zagadnienia (czyli można wywalić) PRM_Value - tak samo (można pominąć) PRM_Sort - kierunek sortowania (wartość liczbowa) PRM_Active - wartość 1 jesli parametr aktywny i widoczny, 0 jeśli nieaktywny i niewidoczny 2 tabelą są wartości tych parametrów:
PRV_Id - id rekordu w tej tabeli PRM_Id - id parametru (z poprzedniej tabeli) PRV_Value - wartość widoczna dla użytkownika, np. Parametr Kolor, wartości: różowy, zielony, niebieski... PRV_Sort - ustawienie kolejności sortowania (wartość liczbowa) i ostatnia tabela z parametrami przypisanymi do samych produktów:
Opis pól: PRP_Id - id rekordu PRD_Id - id produktu PRV_Id - id wartości (po tym dojdziecie jaki to parametr) PRP_Value - wartość dla pola range (zakres) To by było tyle jeśli chodzi o mój układ. Napisanie samego zapytania chyba nie powinno stanowić problemu, w razie czego go tu wkleje... Pozdo 600 i niech moc będzie z wami (IMG:style_emoticons/default/blinksmiley.gif) |
|
|
![]()
Post
#7
|
|
Grupa: Nieautoryzowani Postów: 34 Pomógł: 1 Dołączył: 22.06.2009 Skąd: Koszalin/Poznań Ostrzeżenie: (0%) ![]() ![]() |
@sniver
Mam bardzo podobny układ tabel. Prawie identyczny. Niemniej właśnie z zapytaniem mam problem. Mógłbyś się podzielić? |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 159 Pomógł: 5 Dołączył: 31.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
Pomijając tabele z bazą produktów, cenami, promocjami itp. duperelami u mnie mniej więcej wygląda to tak:
To zapytanie liczące ilość produktów z wybranymi parametrami (wybrałem je bo jest krótsze, a długość o wiele mniejsza (IMG:style_emoticons/default/smile.gif) )
każde podłączenie tabeli za pomocą join jest generowane przez skrypt php, co w konsekwencji buduje zapytanie sql. Zapytanie zostało wykonane ze strony: http://www.erobay.pl/kategorie/53/Biustonosze.html więc możesz sobie zobaczyć względem parametrów jak sie to składa w całość (IMG:style_emoticons/default/smile.gif) prawde mówiąc to troche sie napociłem by to wymyśleć i by działało, względem wyszukiwarki i kategorii w głąb. Oto mój sposób - może nie najlepszy i nie najbardziej efektywny ale działa ;] PS. Nie wykorzystuje parametrów póki co, ale ten sposób napewno działa - poprostu parametry nie są przypisane do produktów (IMG:style_emoticons/default/biggrin.gif) Ten post edytował sniver 7.10.2010, 13:10:04 |
|
|
![]()
Post
#9
|
|
Grupa: Nieautoryzowani Postów: 34 Pomógł: 1 Dołączył: 22.06.2009 Skąd: Koszalin/Poznań Ostrzeżenie: (0%) ![]() ![]() |
@sniver
Zrobiłem tak jak u Ciebie. Buduję w ten sposób duże zapytanie. Zapytanie wykonuje się całkiem szybko a sposób jest nader skuteczny i przede wszystkim działa:)
Bardzo dziękuję Ci za pomoc. Serdecznie pozdrawiam:) |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 159 Pomógł: 5 Dołączył: 31.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
nie ma za co - w takim razie myślę że ktoś może zamknąc (IMG:style_emoticons/default/haha.gif)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 07:40 |