Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z zapytaniem, pobranie produktów na podstawie kilku parametrów
damians1
post 3.12.2008, 05:40:08
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 12.06.2005

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


Mam taką oto tabele z parametrami produktów:

  1. id id_produkt nazwa wartosc id_kat id_param
  2. 149 4914 producent Toshiba 38 8
  3. 150 4914 rodzina produktów Satellite 38 9
  4. 151 4914 rodzaj procesora AMD Turion 64 X2 Dual-Core 38 10
  5. 152 4914 typ procesora TL-60 38 11
  6. 153 4914 częstotliwość procesora 2.0 GHz 38 12
  7. 154 4914 pamięć RAM 3072 MB 38 13
  8. 155 4914 dysk twardy 250 GB 38 14
  9. 156 4914 napęd optyczny DVD-SuperMulti 38 15
  10. 157 4914 karta graficzna ATI Radeon X1250 do 831 MB 38 16
  11. 158 4914 przekątna matrycy 15.4" 38 17
  12. 159 4914 rozdzielczość? matrycy 1280 x 800 WXGA 38 18


to oczywiście tylko niewielki wycinek tabeli.

i zapytanie:
  1. SELECT id_produkt FROM parametry WHERE ((id_param=14 AND wartosc='160 GB') OR (id_param=14 AND wartosc='250 GB')) OR ((id_param=11 AND wartosc='Athlon 64 X2')) GROUP BY id_produkt LIMIT 0, 50;


tabela zawiera parametry produktów (na przykładzie komputerów). mam jeszcze druga tabele z produktami i łącze ją za pomocą JOIN ale dodanie tej tabeli ie stanowi dla mnie problemu więc osunąłem ją z zapytania żeby nie zaciemnieć sprawy.
zapytanie ma za zadanie wyszukać produkty o określonych parametrach i wyświetlić np komputery: procesor Athlon 64 X2 i dysk 250 lub 160, wyniki muszą oczywiście zawierać oba warunki czyli procesor i dysk. w podanym wyżej zapytaniu użyłem operatora OR i szuka mi teraz wszystkich produktów które spełniają jeden z warunków czyli procesor lub dysk, oczywiście zmiana operatora na AND nie wyświetli nic tu trzeba użyć innej metody być może podzapytań? Ja niestety nie wiem w jaki sposób to ugryźć.
Ma ktoś jakiś pomysł?

Z góry dziękuje za odpowiedź

Ten post edytował damians1 3.12.2008, 05:45:18
Go to the top of the page
+Quote Post
BaN
post 4.12.2008, 19:27:32
Post #2





Grupa: Zarejestrowani
Postów: 158
Pomógł: 43
Dołączył: 9.11.2007

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


Moim zdaniem możesz zastosować 2 rozwiązania
  1. zastosować EXISTS dla każdego parametru
  2. zastosować grupowanie i funkcję GROUP_CONCAT
Przykładowe zapytania przy założeniu, że tabela z podstawowymi danymi o produktach nazywa się 'produkty'
    1. SELECT *
    2. FROM produkty WHERE EXISTS (
    3. SELECT 1
    4. FROM parametry WHERE parametry.id_produkt = produkty.id_produkt AND id_param=14 AND (wartosc = '160 GB' OR wartosc = '250 GB')
    5. ) AND EXISTS (
    6. SELECT 1
    7. FROM parametry WHERE parametry.id_produkt = produkty.id_produkt AND id_param=11 AND wartosc = 'Athlon 64 X2'
    8. )
    1. SELECT *
    2. FROM produkty WHERE (SELECT GROUP_CONCAT(wartosc SEPARATOR '|')
    3. FROM parametry WHERE parametry.id_produkt = produkty.id_produkt AND id_param IN (14, 11)
    4. ) IN ('160 GB|Athlon 64 X2', '250 GB|Athlon 64 X2')


Ten post edytował BaN 4.12.2008, 19:30:56
Go to the top of the page
+Quote Post
dr_bonzo
post 4.12.2008, 19:50:52
Post #3





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Jeszcze cos takiego:

  1. SELECT id_produkt, COUNT( id_produkt ) AS param_count FROM parametry WHERE id_param=14 AND (wartosc='250 GB' OR wartosc ='160GB') -- dysk (1 z 2ch opcji) OR (id_param=11 AND wartosc='TL-60') -- typ cpu
  2. GROUP BY id_produkt
  3. HAVING param_count = 2 -- bo 2 parametry przeszukujemy


+ indeks na id_param (bo na wartosc, bedzie raczej gorszy, a 2ch mysql nie uzyje)


--------------------
Nie lubię jednorożców.
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: 18.07.2025 - 19:08