![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 30.11.2007 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Witam
Na stronie której piszę umożliwiłem administratorowi, dodawanie atrybutów produktu. Posiadam 3 tabele. Produkt, Atrybuty, ProduktAtrybuty. Problem pojawia się przy wyszukiwaniu w/g tych "dynamicznych" pól. Zakładam że może byc dowolna liczba pól w.g których można szukać. Tabela produktów: - id - inne pola opisujące produkt Tabela atrybuty: - id - nazwa - typ tabela ProduktyAtrybuty: - id - produkt_id - atrybut_id - wartosc Przykładowe dane w ProduktyAtrybuty: ID | produkt_id | atrybut_id | wartosc 1 | 1 | 1 | 1 2 | 1 | 2 | 1 3 | 2 | 1 | 2 4 | 2 | 2 | 1 Teraz załóżmy że użytkownik chce wyszukać poprzez formularz, produkt który miałby atrybut_id 1 o wartości 1 oraz atrybut_id 2 również o wartości 1. Próbowałem wielu zapytań jednak nic co by działało przy jednym zapytaniu mi nie udało się napisać: SELECT p.produkt_id FROM produktyatrybuty p WHERE (p.atrybut_id = 1 AND p.wartosc = 1) OR (p.atrybut_id = 2 AND p.wartosc = 1) Dla każdego kolejnego atrybutu, jeżeli uczestniczyłby w wyszukiwaniu dodawałbym kolejną parę OR (p.atrybut_id = id AND p.wartosc = wartosc). To zapytanie daje mi praktycznie ile razy dany produkt występuje w atrybutach i jeżeli ilośc wystapień = ilości atrybutów w/g których wyszukuje, wtedy zapisuje ID i następnie wyszukuje juz produkty w ID w tablicy. Rozwiązanie to uważam za beznadziejne, jednak nic lepszego mi nie wpadło do głowy na razie. Ktoś miał może z czymś podobym do czynienia? Mógłby mnie ktoś nakierować, czy da się to załatwić jakoś jednym zapytaniem wyciągającym od razu produkty? Ten post edytował Neider 8.09.2011, 18:23:02 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 27 Pomógł: 3 Dołączył: 19.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
To zapytanie wybierze produkty, które np. mają atrybut_id = 2 i wartosc = 1, ale dla atrybut_id = 1 moze miec wartosc = 123 i takze sie zalapie. W tej chwili nie widze rozwiazan z jednym zapytaniem. Z kilkoma mozna zrobic tak: 1. Najpierw sciagnac produkty z atrybut_id = 1 i wartosc = 1. W kolejnym zapytanie sciagnac atrybut_id = 2 i wartosc = 1 i sprawdzic ktore pojawily sie w obu wynikach (to pochlonie dosyc duzo zasobow) 2. Ewentualnie procedura w bazie Ten post edytował dmateo 8.09.2011, 19:31:00 |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 317 Pomógł: 58 Dołączył: 6.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Strzał w ciemno, bo nie jestem pewny czy dobrze Cię rozumiem. W dodatku pisane na kolanie, ale może mniej więcej o to chodzi?
-------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 30.11.2007 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
@dmateo: Też myślałem o procedurze, przynajmniej wszystko po stronie bazy by się wykonało
@luck: No dokładnie o cos takiego chodzi, z tym że to zapytanie zawsze zwróci pusty wynik. Bo nie ma jednocześnie takiego rekordu gdzie atrybut_id = 1 i atrybut_id = 2 ![]() |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 317 Pomógł: 58 Dołączył: 6.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Sorki, oczywiście masz rację
![]()
-------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 30.11.2007 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Ok sprawdze to jutro w pracy, dam znać jak się uda.
Zapytanie działa w 100% tak jak chciałem. Wielkie dzięki, co do wydajności to pewnie ograniczę, żeby w podstawowej wyszukiwarce używać max 4-5 atrybutów. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 18:13 |