Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> zagniezdzony AND
Zeppelin
post 27.09.2010, 09:51:35
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 9.05.2009

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


Witam,
Mam nastepujacy problem:
Jest tabela CARS z polami:
id (klucz glowny)
owner_id (klucz obcy tabeli owners, więc może się powtarzać. wlasciciel moze posiadac wiele samochodów)
mark
year

I chce wyciagnac wszystkie rekordy, ktore zawieraja np. ZARÓWNO mark=opel oraz year=2002, jak i mark=seat oraz year 2001, czyli takie zagniezdzone AND, tyle, że dość nietypowe (bo to bedzie wyszukiwarka z checkboxami). Moja propozycja jest nastepujaca:
  1. SELECT owner_id FROM cars WHERE (mark=opel AND year=2002) AND (mark=seat AND year=2001)


Czy dobrze kombinuje? Niestety nie moge teraz tego sprawdzic, bo nie mam tu dostepu do mojego projektu, ale podejrzewam, ze to nie bedzie takie proste. Bede wdzieczny za wszelkie wskazówki, dzięki.

Ten post edytował Zeppelin 27.09.2010, 09:53:27
Go to the top of the page
+Quote Post
wookieb
post 27.09.2010, 09:56:52
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1.  
  2. SELECT owner_id FROM cars WHERE (mark=opel AND year=2002) OR (mark=seat AND year=2001)

To co miałeś aktualnie jest sprzeczne i zawsze byś miał pusty wynik.


--------------------
Go to the top of the page
+Quote Post
nospor
post 27.09.2010, 09:56:57
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




yyy, przeciez rekord samochodu nie moze byc jednoczenie mark=opel i mark=seat winksmiley.jpg
Nie AND a OR
(mark=opel AND year=2002) or (mark=seat AND year=2001)


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Zeppelin
post 27.09.2010, 10:05:12
Post #4





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 9.05.2009

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


Dzięki wielkie za odzew.

Cytat(nospor @ 27.09.2010, 10:56:57 ) *
yyy, przeciez rekord samochodu nie moze byc jednoczenie mark=opel i mark=seat winksmiley.jpg
Nie AND a OR
(mark=opel AND year=2002) or (mark=seat AND year=2001)


No właśnie dlatego, że rekord samochodu nie moze byc jednoczenie mark=opel i mark=seat to nie wiem jak to zrobić, żeby mi wybrał TYLKO te owner_id, dla których zachowane są WSZYSTKIE warunki. Logicznie jest to spójne, ponieważ zarowno dla marki opel z rocznikiem 2002, jak i seata z rocznikiem 2001, MOŻE BYĆ ten sam owner_id.

Wg mnie musi się dać to jakos rozwiazac :/ Macie jakies propozycje?
Go to the top of the page
+Quote Post
wookieb
post 27.09.2010, 10:06:09
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No przecież podaliśmy rozwiązanie.


--------------------
Go to the top of the page
+Quote Post
Zeppelin
post 27.09.2010, 10:23:16
Post #6





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 9.05.2009

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


Cytat(wookieb @ 27.09.2010, 11:06:09 ) *
No przecież podaliśmy rozwiązanie.


Przepraszam, zapomniałem coś dopisać.
Otóż OR wg mnie nie zadziała, ponieważ zwróci wynik NAWET WTEDY, GDY bedzie spełniony JEDEN z warunków pomiędzy OR, a mi chodzi o to, aby zwróciło rekord, gdy są spełnione WSZYSTKIE warunki, czyli ten wlasciciel musialby posiadac zarowno seata jak i opla, a z tym OR to zwroci rekord juz wtedy kiedy bedzie posiadal jeden z nich.
Go to the top of the page
+Quote Post
nospor
post 27.09.2010, 10:27:04
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Takie buty....
  1. SELECT owner_id FROM cars
  2. WHERE (mark=opel AND year=2002) OR (mark=seat AND year=2001)
  3. GROUP BY owner_id HAVING count(owner_id) = 2

Coś w ten desen.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Zeppelin
post 27.09.2010, 10:40:44
Post #8





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 9.05.2009

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


Cytat(nospor @ 27.09.2010, 11:27:04 ) *
Takie buty....
  1. SELECT owner_id FROM cars
  2. WHERE (mark=opel AND year=2002) OR (mark=seat AND year=2001)
  3. GROUP BY owner_id HAVING count(owner_id) = 2

Coś w ten desen.


Wow, olbrzymi krok na przód! smile.gif

A co jesli nie znam z góry ile bedzie tych warunków obok OR? Czyli:
  1. WHERE (warunek 1) OR (warunek 2) [OR (warunek n)]


Czy bedzie mozliwe zalatwic to w sql'u? Bo jeśli nie to zalatwie to inaczej po za sql'em, choc w sql'u byloby bardziej optymalnie to zrobić. W kazdym razie wielkie dzięki za pomoc smile.gif
Go to the top of the page
+Quote Post
nospor
post 27.09.2010, 10:44:15
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
A co jesli nie znam z góry ile bedzie tych warunków obok OR? Czyli:
[SQL] pobierz, plaintext
WHERE (warunek 1) OR (warunek 2) [OR (warunek n)]


Czy bedzie mozliwe zalatwic to w sql'u?
Bez problemu
Tu pisałem jak dynamicznie budować warunki dla zapytania
http://nospor.pl/wyszukiwarka-zapytanie-za...d-warunkow.html
musisz tylko wprowadzic lekką modyfikację pod siebie.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 14:59