Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Sprawdzanie czy przedmiot posiada określone parametry
JamalBIG
post
Post #1





Grupa: Zarejestrowani
Postów: 496
Pomógł: 1
Dołączył: 16.01.2008
Skąd: Świnoujście

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


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, (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
com
post
Post #2





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


relacja 1 do wielu? (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
JamalBIG
post
Post #3





Grupa: Zarejestrowani
Postów: 496
Pomógł: 1
Dołączył: 16.01.2008
Skąd: Świnoujście

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


Tak, jeżeli masz na myśli 1 rekord (przedmiot) do wielu parametrów (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
com
post
Post #4





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


pewnie chodzi Ci o coś z rodziny Join http://pl.wikipedia.org/wiki/Join_%28SQL%29 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Posio
post
Post #5





Grupa: Zarejestrowani
Postów: 417
Pomógł: 44
Dołączył: 23.06.2011

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


A co Ci nie działa gdy stosujesz AND ? i WHERE ?
Go to the top of the page
+Quote Post
JamalBIG
post
Post #6





Grupa: Zarejestrowani
Postów: 496
Pomógł: 1
Dołączył: 16.01.2008
Skąd: Świnoujście

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


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





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


a INNER JOIN próbowałeś? bo to jest odpowiednik 'WHERE wartosc='A' AND wartosc='B' AND wartosc='C' (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
JamalBIG
post
Post #8





Grupa: Zarejestrowani
Postów: 496
Pomógł: 1
Dołączył: 16.01.2008
Skąd: Świnoujście

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


Mógł bym Cię prosić o krótki przykład na podstawie tego co opisałem na początku (tabela przedmioty i parametry)?
Go to the top of the page
+Quote Post
com
post
Post #9





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
JamalBIG
post
Post #10





Grupa: Zarejestrowani
Postów: 496
Pomógł: 1
Dołączył: 16.01.2008
Skąd: Świnoujście

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


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





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


faktycznie masz rację... zaćmiło mnie (IMG:style_emoticons/default/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ę...

Ten post edytował com 20.09.2013, 21:33:26
Go to the top of the page
+Quote Post
JamalBIG
post
Post #12





Grupa: Zarejestrowani
Postów: 496
Pomógł: 1
Dołączył: 16.01.2008
Skąd: Świnoujście

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


A co sądzisz o podzapytaniach nazywanych także zapytaniami zagnieżdżonymi?
Go to the top of the page
+Quote Post
com
post
Post #13





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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/
Go to the top of the page
+Quote Post
JamalBIG
post
Post #14





Grupa: Zarejestrowani
Postów: 496
Pomógł: 1
Dołączył: 16.01.2008
Skąd: Świnoujście

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


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





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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





Grupa: Zarejestrowani
Postów: 496
Pomógł: 1
Dołączył: 16.01.2008
Skąd: Świnoujście

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


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?
Go to the top of the page
+Quote Post
com
post
Post #17





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


tak, zlicza ile było parametrów pp.wartosc i jeśli były 3 to tak jak powiedziałeś zwraca wynik (IMG:style_emoticons/default/wink.gif)
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: 23.08.2025 - 16:16