Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z zapytaniem MySQL
maxio
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 17.07.2006

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


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 ...
Go to the top of the page
+Quote Post
sticker
post
Post #2





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


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


--------------------
Go to the top of the page
+Quote Post
maxio
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 17.07.2006

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


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 .
Go to the top of the page
+Quote Post
ikioloak
post
Post #4





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

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


  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..

Ten post edytował ikioloak 9.10.2006, 21:00:18
Go to the top of the page
+Quote Post
maxio
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 17.07.2006

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


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
Go to the top of the page
+Quote Post
ikioloak
post
Post #6





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

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


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.

Ten post edytował ikioloak 10.10.2006, 00:26:57
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 Aktualny czas: 20.08.2025 - 10:43