Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
damians1
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ź
BaN
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')
dr_bonzo
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)
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.