Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> tablica parametrów
ciekawski
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 29.05.2007

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


witam, mam spadkową bazę danych, nie wnikam w poprawność struktury. co najwazniejsze muszę na niej pracować bez większych zmian. mam pewien problem. schemat tablicy parametrów:

id | owner_id | param | value

gdzie id to primary key, owner_id to id uzytkownika dla którego tabela gromadzi parametry, natomiast param to nazwa parameru a value jego wartość.

i teraz dochodzę do momentu filtrowania. Chciałbym pobrać użytkoników (wystarczą same ID), dla których parametry param1 = val1 a param2 = val2

nie mam za bardzo pomysłu. Jedyny, który mam wydaje mi się chyba słaby, mianowicie:
  1. SELECT owner_id, count(*) AS cnt
  2. FROM params
  3. WHERE (param = 'param1' AND value = 'val1') OR (param = 'param2' AND value = 'val2')
  4. GROUP BY owner_id
  5. HAVING cnt = 2


co o tym sądzicie, na pewno są lepsze sposoby?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Kurde... co Ty chcesz od tego sposobu (IMG:style_emoticons/default/smile.gif) Jeśli to ma być na zasadzie param1 = value1 OR param2 = value2 to jest ok

Jeśli to musi być na zasadzie "AND" to jest więcej zabawy ale też da się zrobić - pokombinowałbym z GROUP_CONCAT może...

Albo można dać joina na tej samej tabeli. W podstawowej sprawdzamy parę pierwszą, w joinowanej tabli drugą i liczymy ile jest takich wierszy (IMG:style_emoticons/default/smile.gif)

Tak czy siak twoja metoda działa dla obu przypadków dobrze z tego co widzę (IMG:style_emoticons/default/smile.gif) Innym sposobem zwracającym więcej danych może być ten join:
(nie testowałem tego - ale może działać) (IMG:style_emoticons/default/smile.gif)


  1. SELECT *
  2. FROM params AS p1
  3. JOIN params AS p2 ON p1.owner_id = p2.owner_id
  4. WHERE (p1.param = 'param1' AND p1.value = 'val1') AND (p2.param = 'param2' AND p2.value = 'val2')
  5. GROUP BY p1.owner_id


Ten post edytował Sephirus 22.02.2012, 16:45:35
Go to the top of the page
+Quote Post
ciekawski
post
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 29.05.2007

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


generalnie tych warunków może być więcej lub mniej. Dałem group by aby działało to jak AND i zwracało tylko tych użytkowników którzy spełniają dwa warunki. Na pierwszy rzut oka działa ok i wywala dobrych użytkowników, ale dlatego to wstawiłem, aby ktoś mi potwierdził czy dobrze kombinuje bądź naprowadził na ew. problemy (IMG:style_emoticons/default/smile.gif)

noo, jest jednak słaba strona. Problem pojawia się kiedy chcę pobrać użytkowników którzy mają param1 = val1, natomiast param2 < 3 (z tymże mniejszy od 3 znaczy że może wcale nie być wpisu dla tego parametru, nie ma wpisu param2 = 0). no i tutaj moje zapytanie na pewno zawodzi. Czy ktoś wie jak taki problem rozwiązać?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 01:55