Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: tablica parametrów
Forum PHP.pl > Forum > Bazy danych
ciekawski
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?
Sephirus
Kurde... co Ty chcesz od tego sposobu 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 smile.gif

Tak czy siak twoja metoda działa dla obu przypadków dobrze z tego co widzę smile.gif Innym sposobem zwracającym więcej danych może być ten join:
(nie testowałem tego - ale może działać) 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
ciekawski
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 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ć?
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.