Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem MySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
maxio
Jak się domyślacie ... mam problem smile.gif

Z zapytaniem do MySQLa ...

Chodzi o wyszukiwarke i ogolnie rzecz biorac o relacje wiele do wielu .
Sprawa wyglada tak .

Jest tabela produktow (mz_elementy_2) jest tabela cech(mz_klasyfikacje_2) dla danego produktu .

Element moze miec wiele cech , cechy moga wystepowac w wielu elementach .

Struktura :

mz_elementy_2 :
id_element
nazwa_element

mz_klasyfikacje_2:
id_klasyfikacje
nazwa_klas

i tabela posrednia:

klasyfikacje_elementy
id_klasyfikacje
id_element

chodzi o zapytanie wyszukujace . Zakladamy ze chce wyszukac wszystkie produkty ktore posiadaja okreslone cechy (klasyfikacje) . Czyli produkty ktore mają takie klasyfikacje (id_klasyfikacje = 7 , id_klasyfikacje = 8 i id_klasyfikacje = 4) .

Gdzies sie zaciolem i nie moge drgnac juz chwile ... bede bardzo wdzieczny smile.gif ...
sticker
zakładam że potrzebujesz użyć joinów

SELECT costam,cecha from Tabela1 LEFT JOIN TabelaPrzejsciowa ON costamId= kluczObcyTocostamId LEFT JOIN Tabla2 ON kluczobcyKlasyfikacjaId= klasyfikacjaId
maxio
Cytat(sticker @ 9.10.2006, 16:38:37 ) *
zakładam że potrzebujesz użyć joinów

SELECT costam,cecha from Tabela1 LEFT JOIN TabelaPrzejsciowa ON costamId= kluczObcyTocostamId LEFT JOIN Tabla2 ON kluczobcyKlasyfikacjaId= klasyfikacjaId


Wszystko sie zgadza ale mi chodzi o to konkretne wyszukanie .
Bo JOIN ami zepne wszystko tak jak powinno byc ale chodzi o to ze chce wyszukac produkty ktore maja okreslone cechy .

Ta twoja konstrukcja wyswietli mi poprostu wszystkie produkty ze wszystkimi cechami (klasyfikacjami) a mi chodzi o konkretne wyszukanie produktow ktore maja okreslone cechy .
ikioloak
  1. SELECT p.* FROM mz_elementy2 p JOIN klasyfikacje_elementy k ON (p.id_element = k.id_element) WHERE k.id_klasyfikacje = 7 OR k.id_klasyfikacje = 8 OR k.id_klasyfikacje = 9

cos w tym stylu..
maxio
Cytat(ikioloak @ 9.10.2006, 21:58:20 ) *
  1. SELECT p.* FROM mz_elementy2 p JOIN klasyfikacje_elementy k ON (p.id_element = k.id_element) WHERE k.id_klasyfikacje = 7 OR k.id_klasyfikacje = 8 OR k.id_klasyfikacje = 9

cos w tym stylu..


Cos nie w tym stylu .
Bo chodzi o to ze czym wiecej parametrow (id_klasyfikacje) podam tym powinno byc mniej elementow . W twoim zapytaniu bedzie dokladnie na odwrot . Inaczej mowiac ... jezeli ja mu podam ze ma byc element z klasyfikacjami 6,7,8 to u ciebie wyskocza wszystkie ktore beda mialy 6 lub 7 lub 8 a u mnie musza miec 6 i 7 i 8 ... wiec wypadalo by wpisac AND zamiast OR aaevil.gif
No i pozatym myslalem zeby dodac wiecej aliasow (czyli zeby bylo k.id_klasyfikacje=7 AND k1.id_klasyfikacje=8 itd... ale to jest jakies nie eleganckie pozatym strasznie by mi sie rozbudowalo bo bym mial ponad 30 klasyfikacji wiec sami rozumiecie blink.gif
ikioloak
ok nie zrozumielismy sie. Wymyslilem inne rozwiazanie:
  1. SELECT e.nazwa, ke.id_elementu, count( * ) AS ilosc
  2. FROM klasyfikacje_elementy ke
  3. JOIN elementy e ON ( e.id_element = ke.id_elementu )
  4. WHERE ke.id_klasyfikacji
  5. IN ( 7, 8, 9 )
  6. GROUP BY id_elementu
  7. HAVING ilosc = 3

Dziala przy zalozeniu ze pilnujesz zeby w tabeli laczacej nie powtarzaly sie te same rekordy. Nie jest to idealne rozwiazanie bo ilosc musi byc rowna ilosci id_klasyfikacji jaka sprawdzasz.
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.