Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zagniezdzony AND
Forum PHP.pl > Forum > Bazy danych
Zeppelin
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.
wookieb
  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.
nospor
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)
Zeppelin
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?
wookieb
No przecież podaliśmy rozwiązanie.
Zeppelin
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.
nospor
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.
Zeppelin
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
nospor
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.
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.