Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie wyszukujące na podstawie parametrów (tak jak na allegro)
lorak110786
post
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.

  1. SELECT *
  2. FROM products
  3. LEFT JOIN products_values vals USING(id_product)
  4. HAVING (vals.id_label=61 AND vals.value BETWEEN 100 AND 500) OR (vals.id_label=63 AND vals.value BETWEEN 15 AND 30)


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
sniver
post
Post #2





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:

  1. CREATE TABLE IF NOT EXISTS `parametr` (
  2. `PRM_Id` int(11) NOT NULL AUTO_INCREMENT,
  3. `CAT_Id` int(11) NOT NULL,
  4. `PRM_Name` varchar(45) NOT NULL,
  5. `PRM_FormName` varchar(45) NOT NULL,
  6. `PRM_Type` enum('select','checkbox','range') NOT NULL,
  7. `PRM_MultiSelect` int(1) NOT NULL DEFAULT '0',
  8. `PRM_Value` text NOT NULL,
  9. `PRM_Sort` int(11) NOT NULL DEFAULT '0',
  10. `PRM_Active` tinyint(1) NOT NULL DEFAULT '1',
  11. PRIMARY KEY (`PRM_Id`),
  12. KEY `PARAMERTS` (`CAT_Id`,`PRM_Active`),
  13. KEY `PRM_FormName` (`PRM_FormName`)
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


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:
  1. CREATE TABLE IF NOT EXISTS `parametrvalue` (
  2. `PRV_Id` int(11) NOT NULL AUTO_INCREMENT,
  3. `PRM_Id` int(11) NOT NULL,
  4. `PRV_Value` varchar(255) NOT NULL,
  5. `PRV_Sort` int(11) NOT NULL DEFAULT '0',
  6. PRIMARY KEY (`PRV_Id`),
  7. KEY `parametr` (`PRM_Id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


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:

  1. CREATE TABLE IF NOT EXISTS `productsparametr` (
  2. `PRP_Id` int(11) NOT NULL AUTO_INCREMENT,
  3. `PRD_Id` int(11) NOT NULL,
  4. `PRV_Id` int(11) NOT NULL,
  5. `PRP_Value` varchar(45) NOT NULL,
  6. PRIMARY KEY (`PRP_Id`),
  7. KEY `PRODUCT` (`PRD_Id`),
  8. KEY `VALUE` (`PRV_Id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


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)
Go to the top of the page
+Quote Post

Posty w temacie


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 Aktualny czas: 12.10.2025 - 19:16