Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Sprawdzanie czy przedmiot posiada określone parametry
Forum PHP.pl > Forum > Przedszkole
JamalBIG
Witam

Postaram się opisać problem w miarę jasno i czytelnie:

Posiadam tabelę z przedmiotami ( id | nazwa ) oraz tabelę z parametrami tych przedmiotów ( id | p_id | wartosc ) - p_id to id parametru
Każda wartość parametru to nowy wpis w tabeli;
W jaki sposób sklecić zapytanie do bazy danych aby sprawdzić czy przedmiot z określonym id posiada wszystkie wymienione parametry np.
chce sprawdzić czy przedmiot z id=5 posiada parametry o wartości A, B, C?

Zapytanie z IN() odpada np. zwróci ten sam wynik jeżeli dam IN(A, cool.gif i taki sam jeżeli dam IN(A,B,C) a potrzebuje sprawdzić czy przedmiot posiada wszystkie z wymienionych;
Zapytanie z OR lub AND także nie zdało tutaj egzaminu;

Będę wdzięczny za wszelką pomoc i sugestie;

Pozdrawiam
com
relacja 1 do wielu? wink.gif
JamalBIG
Tak, jeżeli masz na myśli 1 rekord (przedmiot) do wielu parametrów wink.gif
com
pewnie chodzi Ci o coś z rodziny Join http://pl.wikipedia.org/wiki/Join_%28SQL%29 wink.gif
Posio
A co Ci nie działa gdy stosujesz AND ? i WHERE ?
JamalBIG
JOINowałem na wszystkie znane sobie sposoby, jeżeli macie jakieś pomysły będę wdzięczny za pomoc
Co do AND to nielogiczne jest raczej dawanie 'WHERE wartosc='A' AND wartosc='B' AND wartosc='C'...
com
a INNER JOIN próbowałeś? bo to jest odpowiednik 'WHERE wartosc='A' AND wartosc='B' AND wartosc='C' wink.gif
JamalBIG
Mógł bym Cię prosić o krótki przykład na podstawie tego co opisałem na początku (tabela przedmioty i parametry)?
com
przyglądając się bardziej stwierdzam, że jednak bliżej będzie tu CROSS JOIN a przykład masz tu http://pl.wikipedia.org/wiki/Join_%28SQL%2...typu_CROSS_JOIN wink.gif
JamalBIG
Jakoś mi tutaj nie za bardzo pasuje CROSS JOIN (łączy każdy wiersz tabeli tabela1 z każdym wierszem tabeli tabela2) a w tym przypadku w tabeli 'przedmioty' mamy jeden wiersz a w tabeli 'parametry' kilka przyporządkowanych do konkretnego przedmiotu
com
faktycznie masz rację... zaćmiło mnie biggrin.gif jednak chyba bym pozostał przy 'WHERE wartosc='A' AND wartosc='B' AND wartosc='C' bo dało by się to napisać inaczej ale tak naprawdę poco sobie tak utrudniać sprawę...
JamalBIG
A co sądzisz o podzapytaniach nazywanych także zapytaniami zagnieżdżonymi?
com
powiem tak to wszystko zależy od tego jak to rozplanujemy, bo to że czasem wydaje nam się, że użycie po prostu WHERE i kilka instrukcji to czysta amatorszczyzna... wcale nie musi oznaczać, że tak jest gorzej... bo co z tego że rozbudujemy nasze zapytanie na kilka poziomów skoro może się okazać, że czas dostępu jest o wiele dłuższy... np na szybko znalazłem porównanie NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL i Join w tym wypadku okazał się na szarym końcu...

http://explainextended.com/2009/09/15/not-...ull-sql-server/
JamalBIG
Dziękuję Ci bardzo za pomoc ale mimo niej i kilku dni spędzonych nad tym problemem nie przychodzi mi nic innego do głowy jak zapytanie zagnieżdżone (być może moja wiedza o zapytaniach nie jest jeszcze na odpowienim poziomie) dlatego jeżeli ktokolwiek ma konkretną propozycję co do wyglądu takiego zapytania - będę bardzo wdzięczny
mmmmmmm
  1. SELECT p.id FROM przedmiot p JOIN parametry pp ON pp.p_id=p.id WHERE pp.wartosc IN ('parametr1', 'parametr2', 'parametr3') GROUP BY p.id HAVING Count(DISTINCT pp.wartosc)=3

Dla 3.
JamalBIG
Dziękuję Ci bardzo za pomoc, działa perfekcyjnie tak jak tego potrzebowałem! Rozumiem, że na koniec jest sprawdzana ilość wpisów dla danego id - jeżeli jest tyle ile podamy zwraca nam prawidłowy wynik?
com
tak, zlicza ile było parametrów pp.wartosc i jeśli były 3 to tak jak powiedziałeś zwraca wynik wink.gif
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.